我在使用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 =?
答案 0 :(得分:2)
如果您没有明确定义赋值运算符,很明显您的代码已被破坏。 隐式赋值运算符从分配的对象中按成员方式分配每个数据成员。如果您有成员变量,例如在堆上,标准隐式赋值运算符不执行深层复制,只复制指针值。
答案 1 :(得分:2)
创建新对象时使用复制构造函数,指定要复制的对象,所以
MyClass b(a);
(MyClass b = a;
是相同的)
使用复制构造函数。
赋值运算符会更改现有对象的值,因此在您的情况下:
MyClass b;
创建b和
b = a;
使用您尚未定义的赋值运算符。
答案 2 :(得分:0)
在C ++中,复制构造函数和复制赋值运算符密切相关。实际上,复制赋值运算符的惯用实现是根据复制构造函数实现,这意味着复制赋值运算符在内部调用它。这称为copy-and-swap idiom。
它还可以防止意外自我分配导致的奇怪错误。