c++ - 为什么在这个复制赋值构造函数结束时没有释放获取的资源?

标签 c++

我正在阅读 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 不调用任何东西。 elemp 是指针。这是一个内置的类型分配。

关于c++ - 为什么在这个复制赋值构造函数结束时没有释放获取的资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35169139/

相关文章:

c++ - "number>>1"中的 "binary(number >> 1)"是什么意思(十进制转二进制)

c++ - thread_guard 与 scoped_thread

c++ - 双缓冲? Win32 C++

c++ - 如何将重音字符从命令行转换为 wstring?

c++ - Std::vector 不更改类内的数据

c++ - 正交变量代码重复问题

c++ - 我如何包装 BOOST_CHECK_CLOSE?

c++ - 使用初始化列表放置 vector

c++ - vk创建交换链KHR : internal drawable creation failed

c++ - 从注册表中读取的拦截值