请帮我调试下面的代码。我正在做的只是序列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 循环中的语句。有人可以帮我调试吗?还告诉我上面的代码是否可移植?
谢谢, 普拉布