【发布时间】:2014-10-11 11:19:17
【问题描述】:
在学习 C++ 的过程中,我偶然发现了文章 Writing Copy Constructors and Assignment Operators,该文章提出了一种机制,可以避免复制构造函数和赋值运算符之间的代码重复。
为了总结/复制该链接的内容,建议的机制是:
struct UtilityClass
{
...
UtilityClass(UtilityClass const &rhs)
: data_(new int(*rhs_.data_))
{
// nothing left to do here
}
UtilityClass &operator=(UtilityClass const &rhs)
{
//
// Leaves all the work to the copy constructor.
//
if(this != &rhs)
{
// deconstruct myself
this->UtilityClass::~UtilityClass();
// reconstruct myself by copying from the right hand side.
new(this) UtilityClass(rhs);
}
return *this;
}
...
};
这似乎是避免代码重复同时确保“程序完整性”的好方法,但需要权衡浪费精力释放然后分配嵌套内存的风险,这些内存可以被重用(正如其作者指出的那样)。
但我不熟悉它的核心语法:
this->UtilityClass::~UtilityClass()
我假设这是一种调用对象的析构函数(销毁对象结构的内容)同时保留结构本身的方法。对于 C++ 新手来说,语法看起来像是对象方法和类方法的奇怪混合。
谁能给我解释一下这个语法,或者给我一个解释它的资源?
该调用与以下调用有何不同?
this->~UtilityClass()
这是一个合法的电话吗?这是否还会破坏对象结构(从堆中释放;从堆栈中弹出)?
【问题讨论】:
-
如果析构函数删除
dataOK。否则会造成内存泄漏。 -
这是一个异常不安全的雷区(这就是为什么 Sutter 非常正确地贬低它的原因)。您可以考虑使用 copy-and-swap idiom 来避免重复并提供强大的异常保证。
-
虽然我强烈建议您不要使用此模式,但两个调用之间不应有任何区别,您可以将第二个版本
this->~UitilityClass()视为简写。 -
@STNYU 不正确,考虑新的展示位置
标签: c++ destructor copy-constructor