我正在阅读 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 都必须有一个 delete 并且我看到的问题是“我应该在此处使用删除”声明对于每个新的,都应该有一个删除。 我看到了这个问题Must new always be followed by delete?但在那种情况下,程序完成并释放资源,而在上面的代码中程序继续。
(另外,附带一个问题,elem = p 语句会调用复制赋值构造函数吗?这一行让我感到困惑,因为它似乎会调用它并进行某种无限循环)
最佳答案
对于每个被执行的new
,应该有一个被执行的delete
。它不一定在同一个函数中。此外,程序文本中出现的一次 delete
可能会匹配多次不同的 new
出现,反之亦然。执行计数必须匹配,而不是文本出现次数。
elem = p
不调用任何东西。 elem
和 p
是指针。这是一个内置的类型分配。
关于c++ - 为什么在这个复制赋值构造函数结束时没有释放获取的资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35169139/