5

按位复制和按成员复制有什么区别?当然,如果您复制成员,那么您最终还是会复制代表成员的位?

4

4 回答 4

5
class MyClass
{
public:
    MyClass () : m_p (new int (5)) {}
    ~MyClass () {delete m_p;}
    int* m_p;
};

MyClass a;
MyClass b;
memcpy (&a, &b, sizeof (a));

我只是通过重写它的成员变量而不先释放它而泄漏了“a”中分配的int。现在 'a' 和 'b' 有一个 m_p 指向相同的内存位置,并且两者都会在销毁时删除该地址。第二次尝试删除该内存将崩溃。

于 2013-02-27T22:20:35.057 回答
4
  • 按位复制:将对象的对象表示复制为未解释的字节序列。
  • 成员复制:根据对象的类型复制对象的每个子对象。对于具有非平凡复制构造函数的对象,这意味着调用复制构造函数。对于普通可复制类型的子对象,这意味着按位复制。

两者都是相同的,因此如果所有子对象都是可平凡复制的,则整个对象都是可平凡复制的。(类(子)对象也不能有虚成员函数或虚基类。)

于 2013-02-27T22:27:32.900 回答
1

如果您正在二进制复制对象,则可能存在不应复制的内部结构,例如引用计数器。按位复制会破坏这一点。成员副本将使用正确的功能。

于 2013-02-27T22:16:52.247 回答
0

当按位复制引用或指针类型成员时,您可能会遇到麻烦。取决于您真正需要什么,并且可以通过对结果类实例进行浅拷贝或深拷贝来处理。

于 2013-02-27T22:19:05.917 回答