1. ホーム
  2. c++

[解決済み] free()でのエラー: サイズが無効です。

2022-02-17 02:12:12

質問

#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)

入力 ファイヤーブレード 17HFi394 出力する。
ファイアーブレード , 17HFi394 とエラーメッセージが表示されます。 *** Error in ./io: free(): invalid size: 0x00007ffea93f64b0 ***Aborted (core dumped) どなたかこのエラーについて説明し、この問題を克服するために何をすべきかを教えてください。

解決方法を教えてください。

この問題は、あなたが生の std::string オブジェクトをファイルに保存し、それを再び読み込むことができます。その結果 未定義の動作 .

これは std::string は基本的に(そして単純化して)実際の文字列データへのポインタに過ぎません。文字列オブジェクトを書き込むときにポインタを書き、ファイルからオブジェクトを読み出すときにポインタを読みます。問題は、今あなたが 文字列オブジェクトの両方が同じデータを指しています。最初のオブジェクトがスコープ外に出て破壊されると、文字列データが解放され、もう一方のオブジェクトには、もはやあなたのプロセスでは所有していないデータへの無効なポインタが残されます。2番目のオブジェクトが破壊されると、すでに解放されているデータを解放しようとします。

しかも、これは1つのプロセスでオブジェクトの保存と読み込みを行った場合のみです。同じプログラムであっても)別のプロセスでオブジェクトをロードしようとすると、さらに悪いことになります。

データをファイルに保存するには、次のようなことを調べておく必要があります。 シリアライズ .