提升序列化:SIGABRT 同时反序列化包含 std::shared_ptr 的对象上的 boost::shared_p
Boost serialization: SIGABRT while deserializing boost::shared_ptr on object containing std::shared_ptr
我正在尝试对包含std::shared_ptr
的对象执行boost::shared_ptr
的序列化和反序列化。
为此,我使用boost::archive::binary_oarchive
和boost::archive::binary_iarchive
.一切都很顺利,但是当binary_iarchive
实例超出范围时,我会得到SIGABRT。这是我的代码:
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <sstream>
#include <boost/shared_ptr.hpp>
class SomeClass
{
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive &ar, const unsigned int file_version) {
}
};
class ClassWithStdSharedPointer
{
public:
std::shared_ptr<SomeClass> ptr_to_someclass;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive &ar, const unsigned int file_version)
{
ar & ptr_to_someclass;
}
};
int main()
{
boost::shared_ptr<const ClassWithStdSharedPointer> ptr_to_save;
ptr_to_save = boost::make_shared<ClassWithStdSharedPointer>();
std::ostringstream ostream;
boost::archive::binary_oarchive oa(ostream);
oa << ptr_to_save;
std::string serialized_buffer = ostream.str();
std::istringstream istream(serialized_buffer);
{
boost::archive::binary_iarchive ia(istream);
boost::shared_ptr<ClassWithStdSharedPointer> ptr_to_load;
ia >> ptr_to_load;
}
} // the problem appears when you get to this line
我正在使用boost 1.62,它允许序列化std::shared_ptr
。
经过一些研究,我发现,SIGABRT发生在调用类析构函数shared_ptr_helper
(相关代码可以在boost库的文件serialization/shared_ptr_helper.hpp
中找到)。该类有一个std::map
的实例,用于存储反序列化的指针。
std::shared_ptr
的序列化代码与boost::shared_ptr
(文件serialization/shared_ptr.hpp
)几乎相同。实际上,它们都使用单个实例shared_ptr_helper
。因此,上面描述的std::map
包含两种类型的shared_ptr
,但它应该只包含一种类型,这会导致在调用析构函数时产生 SIGABRT。
序列化代码通过上面在serialization/shared_ptr.hpp
中定义的 ID 获取帮助程序。如果我们对不同类型的shared_ptr
使用不同的 ID,问题就会消失。我确实知道这样做是为了处理序列化指向同一对象的多个指针的情况,但在这种情况下,似乎不太可能有人同时使用std::shared_ptr
和boost::shared_ptr
。
那么,这是怎么回事呢?使用这两种类型的shared_ptr
是不好的做法,我应该只选择其中一种,或者 boost 中存在错误?
我发现了一个问题,其中讨论了shared_ptr_helper
的另一个问题。看起来该类实际上有一些设计缺点,所以就我而言,我应该在我的代码中只留下一种类型的shared_ptr
。
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- C++中的指针否定 (!ptr == NULL)
- 从const ptr*转换为ptr*时出现问题
- 无法使用 libtool 将 -shared 参数传递给 g++
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- shared-ptr-C++shared_ptr与unique_ptr用于资源管理