Boost序列化text_iarchive进程死了

时间:2016-08-23 15:28:13

标签: c++ serialization boost ros

我使用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将退出

它所说的目录中没有日志文件。

2 个答案:

答案 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)。