复制构造函数和赋值运算符之间的区别?

时间:2014-04-06 11:39:40

标签: c++ class constructor copy

我在使用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 =?

3 个答案:

答案 0 :(得分:2)

如果您没有明确定义赋值运算符,很明显您的代码已被破坏。 隐式赋值运算符从分配的对象中按成员方式分配每个数据成员。如果您有成员变量,例如在堆上,标准隐式赋值运算符不执行深层复制,只复制指针值。

答案 1 :(得分:2)

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

MyClass b(a);MyClass b = a;是相同的)

使用复制构造函数。

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

MyClass b;

创建b和

b = a;

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

答案 2 :(得分:0)

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

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