Ошибка в 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 в основном (и упрощенно) просто указатель на фактические строковые данные. Когда вы пишете строковый объект, вы пишете указатель, а когда вы читаете объект обратно из файла, вы читаете указатель. Проблема в том, что теперь у вас есть два строковых объекта, которые указывают на одни и те же данные. Когда первый объект выходит из области видимости и уничтожается, он освобождает строковые данные, оставляя другой объект с недопустимым указателем на данные, которые больше не принадлежат вашему процессу. Когда этот второй объект будет уничтожен, он попытается освободить уже свободные данные.

И это только когда вы сохраняете и загружаете объект в одном процессе. Еще хуже, если вы попытались загрузить объект в другом процессе (даже если это одна и та же программа), и для современной системы виртуальной памяти никакие два процесса не имеют одинаковые карты памяти.

Чтобы сохранить данные в файл, вам следует изучить сериализацию.

Другие вопросы по тегам