Ошибка в free(): неверный размер
#include <bits/stdc++.h>
using namespace std;
class student
{
string name;
string reg;
public:
void getdata()
{
getline(cin,name);
getline(cin,reg);
}
void printdata()
{
cout<<name<<"\t"<<reg<<endl;
}
};
int main()
{
ifstream fin;
ofstream fout;
student obj;
fout.open("google.txt",ios::out|ios::binary);
obj.getdata();
fout.write((char*)&obj,sizeof(obj));
fout.close();
student obj2;
fin.open("google.txt",ios::in|ios::binary);
fin.read((char*)&obj2,sizeof(obj2));
obj2.printdata();
fin.close();
return 0;
}
Я пытаюсь базовую операцию чтения и записи обработки файлов объектов. Но после выполнения приведенного выше кода я успешно могу писать и читать, но я получаю сообщение об ошибке *** Error in ./io: free(): invalid size: 0x00007ffea93f64b0 ***Aborted (core dumped)
Вход:
Fire Blade, 17HFi394 Выход:
Fire Blade, 17HFi394 и сообщение об ошибке: *** Error in ./io: free(): invalid size: 0x00007ffea93f64b0 ***Aborted (core dumped)
Может кто-нибудь объяснить эту ошибку и что я должен сделать, чтобы преодолеть эту проблему.
2 ответа
std::string size является переменной величиной, попробуйте следующий код:
`` `
char name[256];
char reg[256];
void getdata()
{
std::cin.getline(name, sizeof(name));
std::cin.getline(reg, sizeof(reg));
}
`` `
Проблема в том, что вы пишете сырой std::string
Объект в файл, а затем прочитайте его снова. Это приводит к неопределенному поведению.
Это не работает, потому что std::string
в основном (и упрощенно) просто указатель на фактические строковые данные. Когда вы пишете строковый объект, вы пишете указатель, а когда вы читаете объект обратно из файла, вы читаете указатель. Проблема в том, что теперь у вас есть два строковых объекта, которые указывают на одни и те же данные. Когда первый объект выходит из области видимости и уничтожается, он освобождает строковые данные, оставляя другой объект с недопустимым указателем на данные, которые больше не принадлежат вашему процессу. Когда этот второй объект будет уничтожен, он попытается освободить уже свободные данные.
И это только когда вы сохраняете и загружаете объект в одном процессе. Еще хуже, если вы попытались загрузить объект в другом процессе (даже если это одна и та же программа), и для современной системы виртуальной памяти никакие два процесса не имеют одинаковые карты памяти.
Чтобы сохранить данные в файл, вам следует изучить сериализацию.