【发布时间】:2013-03-06 07:30:28
【问题描述】:
假设构造函数、析构函数和赋值运算符写得正确,为什么我不能像这样实现复制构造函数:
MyClass::MyClass(const MyClass &other)
{
this->value = new Value(*(other.value));
}
我看到的大多数示例都是这样做的:(因为它们通常处理数组)
MyClass::MyClass(const MyClass &other)
{
Value *temp = new Value;
*temp = *(other.value);
this->value = temp;
}
但在第一个示例中,如果“new”抛出,“other”不受影响,并且如果 Value 的复制构造函数抛出,“new”不会在传播异常之前释放分配的内存吗?
由于这是一个迷你智能指针本身,我特别避免使用 std::unique_ptr 和其他智能指针。
【问题讨论】:
-
为什么
value首先是动态分配的?您试图以高昂的成本为其赋予价值语义,并且做错了吗? -
Value 是指向另一个类的指针。也许“价值”这个名字是错误的词——我应该使用更通用的“数据”或“其他类”。如果我是“也做错了”,这就是我问这个问题的原因,因为我不知道我做对了还是错。
-
@JaminGrey 如您所示,实现复制构造函数没有任何问题。如果复制构造函数抛出,the memory allocated by new will be freed before the exception propagates。事实上,如果 Value 的赋值运算符抛出异常,第二个示例可能会导致内存泄漏。
-
@WhozCraig 不是被“新”清理了吗?这就是link Praetorian 发布的暗示,以及@bames53's answer 所说的,除非我误读了一些东西,我可能是。 new 不会捕获构造函数中抛出的异常或复制正在分配的类的构造函数吗?
-
@JaminGrey 是的,你是完全正确的,我不得不通过帖子和一些标准参考来确定,但他(Paretorian)和你是完全正确的;这就是它应该表现的方式,因此我坚定地站在选项 #1 =P 的阵营中
标签: c++ copy-constructor