c++ - boost::serialization: 重载 load_construct_data: 根本没有可访问的构造函数

标签 c++ boost new-operator boost-serialization

所以我正在使用 boost::serialization 库,并且我试图覆盖类的构造方式,因为它没有默认构造函数。这是 demonstrated here .在我看来,该函数采用 class* t 然后将其设置为指向新构造的对象。如果我错了,这绝对是我错误的根源。

但是,构造我的类的唯一方法是使用另一个类的 create() 函数,这意味着我需要偏离示例中的代码(这在 boost 中说明::序列化命名空间): ::new(t)my_class(attribute);

我尝试简单地调用创建函数并将 t 设置为返回的指针,但这似乎不起作用,因为紧接在 load_construct_data 函数 之后,并且在序列化函数,给定的 myClass& 与我设置的“t”不同。

无论::new(t) 正在做什么,我该怎么做才能使使用 create 函数创建的对象跟随到序列化/其他函数中?

最佳答案

您的问题 (new(t) my_class(attribute)) 中提到的构造称为“placement new”。它的工作方式是这样的

  1. t 必须已经指向已分配的内存区域(placement new 默认不进行分配)
  2. 在该内存位置构造了一个 my_class 的实例。

但是,由于在您的情况下您不能使用构造函数,因此使用任何形式的 new 都是不可能的。但还有另一种选择(某种程度上)。

由于 placement new 几乎只是覆盖一 block 内存,我们可以使用一个常规函数来对已经构造的对象执行相同的操作。这样的函数是memcpy:

void * memcpy ( void * destination, const void * source, size_t num );

所有 memcpy 所做的就是执行 num 字节的逐字节复制,从 source 指向的内存到目的地

假设您开始使用 load_construct_data 中的这段代码

my_class obj = other_class::create();

然后我们可以使用memcpy 函数将obj 处的值“移动”到t 的内存引用中:

memcpy((void*)t, (void*)(&obj), sizeof(obj));

虽然有一些关于它如何与您的特定类一起工作的详细信息,例如按位复制是否“足够好”,但这是我对您所要求的最好的。我看到的一个问题是,如果析构函数释放资源,那么拷贝可能会变得无效。

为了解决销毁可能出现的问题,您可以编写自己的深度复制函数:

void deepCopy( my_class * destination, const my_class * source );

你调用它而不是 memcpy

注意:如果我在这里误入歧途,请告诉我。我目前没有用于测试代码的机器。

关于c++ - boost::serialization: 重载 load_construct_data: 根本没有可访问的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7050145/

相关文章:

带有数组的 C++ 构造函数初始化列表

c++ - this_thread::sleep_for 和 C++11 标准指定的计时时钟之间的关系吗?

c++ - 在 Python 中使用 Boost 图形库

boost - 无法为 cmake 指定 BOOST_ROOT

c++ - MinGW 中的全局重载运算符 new/delete

c++ - 字符指针(由 new 分配)及其初始化

c++ - 使用参数创建新对象

c++ - 递归树,打印祖先节点

c++ - 从列表/ map 自动生成条件表达式

c++ - enable_if 类型的大小未知