我正在阅读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语句会调用拷贝分配构造函数吗?此行使我感到困惑,因为它似乎会调用它并执行某种无限循环)
您的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
只是在更改其指向的位置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句