【问题标题】:Difference between Copy Constructor and Assignment Operator? [duplicate]复制构造函数和赋值运算符的区别? [复制]
【发布时间】:2014-05-18 13:55:04
【问题描述】:

我在使用 Copy Constructor 时遇到了一点问题。

我有一个类,它包含两个结构和两个指向第一个结构的指针(假设我有一个第一个结构的链表,每个都包含第二个结构的链表)。他们似乎都工作正常。但是……

当我使用复制构造函数创建类的另一个实例时(进行深度复制,每个元素都被复制,因此每个实例都有自己的链表)使用

MyClass a,b; // Operations with a b ( a );

一切正常。但是后来……

MyClass a,b; // Operations with a b = a;

似乎也可以工作,但随后我的析构函数失控,并尝试多次释放某些元素,并发送以下内容:

* `./a.out' 中的错误:双重释放或损坏 (!prev):0x000000000258a540 *

与 ==Backtrace== 和 ==Memory Map== 一起,结束通过 SIGABRT 信号杀死我的程序。

那么,当复制构造函数工作正常并且存在时,赋值有什么问题?我应该覆盖 operator= 吗?

【问题讨论】:

  • 如果你显示使用MyClass的代码,这将更有成效。
  • 不看代码无法回答...
  • 除非您有电话接线员MyClass::operator()(MyClass),否则第一个版本无法正常工作。

标签: c++ class constructor copy


【解决方案1】:

如果您没有明确定义赋值运算符,很明显您的代码已损坏。 隐式赋值运算符对分配对象中的每个数据成员进行成员分配。如果您有成员变量,例如生活在堆上的标准隐式赋值运算符不做深拷贝,只拷贝指针值。

【讨论】:

  • 谢谢。我认为编译器通过赋值运算符隐式使用复制构造函数。
  • 不客气。复制构造函数是一个“真正的”构造函数,与运算符无关。玩得开心:-)
【解决方案2】:

创建新对象时使用复制构造函数,指定要复制的对象,所以

MyClass b(a);MyClass b = a;同理)

使用复制构造函数。

赋值运算符更改现有对象的值,因此在您的情况下:

MyClass b;

创建 b 和

b = a;

使用尚未定义的赋值运算符。

【讨论】:

    【解决方案3】:

    在 C++ 中,复制构造函数和复制赋值运算符密切相关。实际上,复制赋值运算符的惯用实现是根据复制构造函数实现,这意味着复制赋值运算符在内部调用它。这称为copy-and-swap idiom

    它还可以防止由于意外自分配而导致的奇怪错误。

    【讨论】:

      猜你喜欢
      • 2015-03-03
      • 2012-07-27
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多