以下のコードのデバッグを手伝ってください。私がやっていることはvector<string>
、バイナリファイルにシリアル化してそこから取得することです。これがメインコードの例です。
/* Portion Commented */
vector<string> list;
list.push_back("AAAAAA");
list.push_back("BBBBBB");
list.push_back("CCCCCC");
list.push_back("DDDDDD");
// Write out a list to a disk file
ofstream os ("/home/test/data.dat", ios::binary);
int size1 = list.size();
os.write((const char*)&size1, sizeof(int));
os.write((const char*)&list[0], size1 * sizeof(string));
os.close();
/* Portion Commented */
// Read it back in
VertexList list2;
ifstream is("/home/test/data.dat", ios::binary);
int size2;
is.read((char*)&size2, sizeof(int));
list2.resize(size2);
cout<<"Size is :"<<size2<<endl;
is.read((char*)&list2[0], size2 * sizeof(string));
for (int i=0; i < size2; i++)
{
cout<<"At i = "<<i<<", "<<list2[i]<<endl; //Line 40 in my program
}
4つの要素をベクトルリストにプッシュしました。次に、ベクターをシリアル化し、バイナリファイルに書き込んで、同じファイルから取得します。正常に動作します。
後で上記のコードの「部分コメント」にコメントし、作成済みのバイナリファイル「data.data」から直接ベクトルを取得しようとすると、forループの直前にサイズが4として正しく出力されますが、セグメンテーション違反イベントが表示されます。 。これは、これ(valgrind --leak-check=yes ./a.out
)で作成された私のvalgrind出力です。
==14058== Invalid read of size 8
==14058== at 0x4EBE263: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (in /usr/lib/libstdc++.so.6.0.14)
==14058== by 0x40107F: main (test2.cpp:40)
==14058== Address 0x2156010 is not stack'd, malloc'd or (recently) free'd
40行目はcout
、最後のforループのステートメントです。誰かが私がこれをデバッグするのを手伝ってもらえますか?また、上記のコードが移植可能かどうかも教えてください。
ありがとう、プラブ