【问题标题】:C++ bitwise vs memberwise copying? [closed]C ++按位与按成员复制? [关闭]
【发布时间】:2013-02-27 22:14:18
【问题描述】:

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

【问题讨论】:

  • 您的意思是使用 memcpy 而不是单独分配每个成员?
  • 按成员复制意味着您通过复制对象的所有数据成员来复制对象。如果成员的类型定义了复制构造函数,这可能等同于按位复制。但是,对于那些确实具有复制构造函数的成员,复制逻辑由复制构造函数定义,可能不等同于按位复制。
  • @BoPersson 您发布的其他 SO 链接甚至不包含“位”一词 - 因此我不认为它是重复的....
  • @user - 考虑 memcpy 的作用 - 按位复制

标签: c++ copy-constructor


【解决方案1】:
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 指向相同的内存位置,并且两者都会在销毁时删除该地址。第二次尝试删除该内存将会崩溃。

【讨论】:

  • 在这个例子中,有 2 次分配(不同的地址)和 2 次删除相同的地址。所以...一个泄漏,一个被删除两次
  • 你有两个分配和两个释放。但是您将两个释放都应用于同一个分配的对象。这样你会泄漏两个动态分配的对象之一,而另一个被双重删除。
  • 你说得对,我还是去睡觉吧!
【解决方案2】:
  • 按位复制:将对象的对象表示复制为未解释的字节序列。
  • 按成员复制:根据对象的类型复制对象的每个子对象。对于具有非平凡复制构造函数的对象,这意味着调用复制构造函数。对于普通可复制类型的子对象,这意味着按位复制。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-14
        • 1970-01-01
        • 2013-03-10
        相关资源
        最近更新 更多