아래 코드를 디버깅하는 데 도움주세요. 내가 뭘하는지 vector<string>
이진 파일로 직렬화하고 그것을 다시 검색 할 수 있습니다. 다음은 예제 메인 코드입니다.벡터에서 C++ 세그먼트 화 오류 serialize/deserialize
/* 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"에서 벡터를 직접 가져 오려고하면 크기가 정확하게 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
문입니다. 누군가가 이것을 디버깅 할 수 있습니까? 또한 위의 코드가 이식 가능한지 여부를 알려주시겠습니까?
덕분에, Prabu
'sizeof (string)'은 (는) 생각한대로 작동하지 않습니다. – Vikas
실제로 * serialize하는 것을 잊어 버렸습니다.방금 데이터의 의미 *를 복구하기 위해 다시 해석 할 수 있는지에 대한 염려없이 디스크의 메모리 내용을 디스크에 썼습니다. –