gpt4 book ai didi

vector 序列化/反序列化中的 C++ 段错误

转载 作者:太空狗 更新时间:2023-10-29 20:28:22 25 4
gpt4 key购买 nike

请帮我调试下面的代码。我正在做的只是序列化 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 个元素插入 vector 列表。然后我序列化 vector 并将其写入二进制文件并从中检索它。它工作正常。

稍后,当我在上面的代码中注释“部分注释”并尝试直接从已经创建的二进制文件“data.data”中检索 vector 时,它显示了段错误事件,尽管它正确地打印了之前的大小 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 行是 cout最后一个for循环中的语句。有人可以帮我调试吗?还告诉我上面的代码是否可移植?

谢谢,帕布

最佳答案

std::string 的实现包含一个指向堆上实际字符串内容的指针。所以,sizeof(string) 只是指针加上一些字节。如果要写字符串,就必须自己写内容

for (auto i = list.begin(); i != list.end(); ++i) {
os.write(i->c_str(), i->size() + 1);
}

当你读回它时,你必须寻找终止的 NUL 字节。或者,您可以保存字符串的长度,就像您对列表所做的那样

for (auto i = list.begin(); i != list.end(); ++i) {
int len = i->size() + 1;
os.write((const char*)&len, sizeof(len));
os.write(i->c_str(), i->size() + 1);
}

关于 vector 序列化/反序列化中的 C++ 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13396784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com