【问题标题】:Boost:Serialization: Who cleans up the deserialized data?Boost:Serialization:谁来清理反序列化的数据?
【发布时间】:2015-06-19 14:14:28
【问题描述】:

我正在序列化对象的原始指针并将其发送到另一个应用程序。

反序列化时,我得到了另一个原始指针。这意味着 Boost::Serialization 在内部构造这个指针后面的对象。我现在很好奇谁拥有该对象的所有权,如果不再需要 Boost 是否会删除该对象。

一些可能更好地说明问题所在的代码:

void anyMethod()
{
    std::ifstream file("archiv.txt"); 
    boost::archive::text_iarchive ia(file); 
    AnyClass* object; 
    ia >> object; 
    //work with object
}

//Now what has happened to object?
//Is it deleted, cause it went out of scope?
//Do I have to delete it myself?

【问题讨论】:

  • 你可能需要清理自己。一般来说,C++ 是一个非常多的,如果你想花时间做某事,明确地说你想花那个时间。

标签: c++ pointers boost-serialization


【解决方案1】:

我对@9​​87654321@关于指针序列化的理解是所有权由存档保留:“多次加载相同的指针对象会导致仅创建一个对象,从而复制原始指针配置”。这往往表明图书馆负责簿记。

此外,存档提供了delete_created_pointers 方法:“删除由加载指针创建的所有对象。这可用于避免在加载指针并且存档加载遇到异常时可能发生的内存泄漏” .

【讨论】:

  • 非常感谢,这正是我要找的地方
【解决方案2】:

我不明白为什么AnyClass* object; 在这种情况下是合法的,IMO 你必须有一个AnyClass 的对象(看看http://en.highscore.de/cpp/boost/serialization.html)然后一遍又一遍地重复使用它。现在当这个对象(不是指针)超出范围时,它将被删除。

【讨论】:

  • Boost::Serialization 也能够反序列化指针,这在进行多态序列化时是必不可少的。
【解决方案3】:

很抱歉回答这个老问题。 我试过demo,发现它有内存泄漏。该演示将存档恢复到函数中的对象(内部使用指针)。当函数返回并返回对象时,档案被破坏。分配的内存没有被任何人清理。我修改demo多次运行restore函数,发现进程占用内存越来越大。所以如果需要清理分配的内存,可以通过指针手动删除对象,或者调用delete_created_pointers()。

【讨论】:

    猜你喜欢
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    相关资源
    最近更新 更多