[英]Why does assignment operator call both copy ctor and assignment operator?
[英]Why isn't the acquired resource released at the end of this copy assignment ctor?
我正在阅读C ++编程语言第4版,并且到达了有关复制分配构造函数的部分。 作者有一个名为Vector的类,他这样定义了副本分配构造函数
Vector& Vector::operator=(const Vector& a)
{
double* p = new double[a.sz];
for (int i=0; i != a.sz; ++i)
p[i] = a.elem[i];
delete[] elem;
elem = p;
sz = a.sz;
return *this
}
(对于那些拥有这本书的人,可以在第74页上找到。)现在,我的问题是:如果p具有新资源,为什么在返回之前不通过删除将其发布? 或用另一种方式说:为什么缺少delete [] p不能视为内存泄漏?
我之所以这样问,是因为到目前为止,我已经注意到每个新文件都必须有一个删除,并且我看到的问题“我应该在这里使用删除 ”表明每个新文件都应该有一个删除。 我看到了这个问题是否必须始终在new之后跟随删除? 但是在那种情况下,程序结束并且资源被释放了,而在上面的代码中程序继续了。
(此外,在另一个问题上,elem = p语句会调用复制分配构造函数吗?此行使我感到困惑,因为它似乎会调用它并执行某种无限循环)
通常的模式是,如果类拥有资源,则其析构函数将释放该资源(请参阅RAII )。 因此,毫无疑问,
Vector::~Vector()
{
delete[] elem;
}
别处。
在对象生命周期的各个阶段,其他操作可能会释放资源,例如,在这种情况下为副本分配构造函数。 如果完成此操作,则资源将被仔细地重新分配,或者将其设置为指示没有任何要释放的状态(例如,将其设置为nullptr
)。
关于第二个问题。 Vector
的副本分配运算符只是在为指针分配一个新值- 不涉及递归。
对于每个要执行的new
,应该在要执行的某处delete
。 它不一定必须具有相同的功能。 此外,在程序文本中出现一次delete
可能会与多次出现new
匹配,反之亦然。 执行次数必须匹配,而不是文本匹配。
elem = p
不会调用任何东西。 elem
和p
是指针。 这是内置的类型分配。
您担心的delete
将在这种情况的destructor
中完成。
代码正在做的是为数据创建空间,复制数据并释放旧内存。 留下新的内存供以后处理, RAII
旁注:
elem = p
它不会调用class
复制操作,因为它们是指向POD(普通旧数据类型)的指针
您正确地分配了p
而没有随后的delete[]
调用是正确的; 但是,正如您还观察到的那样, p
指向的内存也由elem
指向:
double* p = new double[a.sz]; // allocate memory
delete[] elem; // delete the old memory
elem = p; // point to the new memory allocated
正如其他人指出的那样, elem
在析构函数中被删除。
没有复制构造函数调用,因为没有复制:指针elem
只是在更改它指向的位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.