【问题标题】:Boost serialization text_iarchive process diedBoost序列化text_iarchive进程死亡
【发布时间】:2016-08-23 15:28:12
【问题描述】:

我正在使用 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/Workspace/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 将退出

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

【问题讨论】:

    标签: c++ serialization boost ros


    【解决方案1】:

    我不确定你是如何创建 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)。

    【讨论】:

    • 嗨@isanae,我已将输出更改为oa &lt;&lt; BOOST_SERIALIZATION_NVP(*mpMap);,输入为Map* tmpMap = new Map(); ia &gt;&gt; BOOST_SERIALIZATION_NVP(*tmpMap);,但我仍然收到输入流错误。你知道为什么会这样吗?
    【解决方案2】:

    看起来tmpMap 是一个未初始化的指针,因为您从未将它设置为任何东西。

    Map* tmpMap;
    ...
    ia >> *tmpMap;
    ...
    mpMap = tmpMap;
    

    创建指针时,它们并不指向有效地址。这意味着当您尝试使用 ia &gt;&gt; *tmpMap; 反序列化存档时,您会将数据放入一个无用的内存位置。这很可能会引发分段错误,从而导致崩溃。

    要解决此问题,您可以在这种情况下删除指针的使用,以便将其更改为:

    Map tmpMap;
    ...
    ia >> tmpMap;
    ...
    *mpMap = tmpMap;
    

    【讨论】:

      猜你喜欢
      • 2018-02-22
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      • 2015-09-02
      • 2012-12-11
      • 1970-01-01
      • 2015-04-08
      相关资源
      最近更新 更多