我可以制作C++对象的按位副本吗?

Meh*_*ran 5 c++

可以使用按位复制复制C++对象吗?我的意思是使用memcopy_s?是否存在可能出错的情况?

rme*_*dor 17

如果它们是普通旧数据(POD)类型,那么这应该有效.任何包含其他类实例的类都可能会失败,因为您在不调用其副本构造函数的情况下复制它们.它失败的最可能方式是它们的一个析构函数将释放一些内存,但是你已经重复指向它的指针,所以你试着从你复制的一个对象中使用它并获得段错误.简而言之,除非它是POD,否则不要这样做,你确定它永远是POD.

  • 风险,是的,但它本身并不是一个错误.由于类型是POD,它没有一个偷偷摸摸的析构函数会尝试删除指针,所以如果你自己做的话它只会被双删除. (5认同)

Jar*_*Par 10

不,这样做会导致很多问题.您应该始终使用赋值运算符或复制构造函数来复制C++类型.

使用按位复制会破坏任何类型的资源管理,因为在一天结束时,您将留下2个对象,其中1个构造函数已运行,并且将运行2个析构函数.

以ref计数指针为例.

void foo() {
  RefPointer<int> p1(new int());
  RefPointer<int> p2;
  memcpy(&p2,p1,sizeof(RefPointer<int>));
}
Run Code Online (Sandbox Code Playgroud)

现在p1和p2都保持相同的数据,但内部引用计数机制尚未得到通知.两个析构函数都会认为它们是数据的唯一所有者,可能导致值被破坏两次.

  • 值得注意的是,即使使用 POD'ish 类(即仅限 POD 字段,但也可以是虚拟方法),即使它可以工作,它在技术上仍然是 UB。 (2认同)