我使用boost :: archive来序列化我的对象。我的代码在这里:
void Tracking::SaveMap() {
ofstream ofs("/home/yisha/Workspace/Map/map.txt");
boost::archive::text_oarchive oa(ofs);
oa << *mpMap;
}
bool Tracking::LoadMap() {
cout << "\nLoading map..." << endl;
Map* tmpMap;
ifstream ifs("/home/yisha/Workspace/Map/map.txt");
if(!ifs.good()) {
printf("ifs not good\n");
return false;
}
printf("after ifstream\n");
boost::archive::text_iarchive ia(ifs);
printf("after archive\n");
ia >> *tmpMap;
printf("after ia\n");
mpMap = tmpMap;
cout << "Loading map finished!" << endl;
return true;
}
mpMap
是一个实现了序列化功能的对象
地图已成功保存,但我无法验证map.txt
是否正确,因为我无法加载地图
我在ros里面运行,运行时错误只是进程死了。我在这里得到了输出:
加载地图...
在ifstream之后 归档后 [mono-1]进程已经死亡[pid 19721,退出代码-11,cmd / home / yisha /工作区/ VO / ORB_SLAM2 / Examples / ROS / ORB_SLAM2 / Mono __name:= mono __log:= / home / yisha / .ros /log/811c9cf6-68a6-11e6-9123-408d5cb4a2ef/mono-1.log。
日志文件:/home/yisha/.ros/log/811c9cf6-68a6-11e6-9123-408d5cb4a2ef/mono-1*.log
机器上的所有进程都已经死亡,roslaunch将退出
它所说的目录中没有日志文件。
答案 0 :(得分:0)
看起来tmpMap
是未初始化的指针,因为您从未将其设置为任何内容。
Map* tmpMap;
...
ia >> *tmpMap;
...
mpMap = tmpMap;
创建指针后,他们不会指向有效地址。这意味着当您尝试使用ia >> *tmpMap;
反序列化存档时,您将数据放入dud内存位置。这可能会导致分段错误,导致崩溃。
要解决此问题,您可以在这种情况下删除指针的使用,因此可以将其更改为:
Map tmpMap;
...
ia >> tmpMap;
...
*mpMap = tmpMap;
答案 1 :(得分:0)
我不确定你是如何创建mpMap
的,但它看起来好像在堆上。在这种情况下,您有两个选择。您可以通过取消引用指针来序列化对象本身,就像您正在做的那样。问题是,当你加载数据时,你需要一个读入的对象。
Map* tmpMap = new Map;
ia >> BOOST_SERIALIZATION_NVP(*tmpMap);
确保正确删除tmpMap
。
您也可以序列化指针本身,而boost将负责内存管理:
// saving, note that there's no dereferencing
oa << BOOST_SERIALIZATION_NVP(mpMap);
// loading, still no dereferencing
Map* tmpMap;
ia >> BOOST_SERIALIZATION_NVP(tmpMap);
你不能做的是保存一个对象(*mpMap
)并希望把它读成一个指向任何东西的指针(tmpMap
)。