請幫我調試下面的代碼。我所做的只是將vector<string>
序列化爲二進制文件並從中取回。這裏是示例主代碼,向量序列化/反序列化中的C++分段錯誤
/* 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個元素推入向量列表。然後,我序列化矢量並將其寫入一個二進制文件並從中取回。它工作正常。
後來當我在上面的代碼中評論'Portion Commented'並試圖直接從已創建的二進制文件「data.data」中檢索矢量時,它顯示了段錯誤事件,雖然它正確地將尺寸打印爲4在for循環之前。這是這個(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號線是在最後for循環cout
聲明。有人可以幫我調試嗎?另外告訴我,上面的代碼是否可移植?
感謝, Prabu
'sizeof(string)'不會做你認爲它的作用。 – Vikas
你忘了實際*序列化*任何東西。您只是將內存內容寫入磁盤,而不用擔心是否可以重新解釋它們以恢復數據的*含義*。 –