为什么在副本分配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语句会调用拷贝分配构造函数吗?此行使我感到困惑,因为它似乎会调用它并执行某种无限循环)

您的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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么使用交换来实现副本分配?

来自分类Dev

有没有正当理由不从副本分配运算符返回* this?

来自分类Dev

为什么我的副本分配运算符从未调用过?

来自分类Dev

为什么std :: reference_wrapper显式定义副本分配运算符?

来自分类Dev

为什么没有释放内存?

来自分类Dev

这两种调用基类副本分配的方式有什么区别?

来自分类Dev

这两种调用基类副本分配的方式有什么区别?

来自分类Dev

为什么引用类型成员导致隐式声明的副本分配运算符被删除

来自分类Dev

为什么在visual studio中实现断点之前没有释放内存时动态分配显示严重错误

来自分类Dev

如何避免副本分配运算符出现双重释放或损坏(快捷方式)?

来自分类Dev

为什么ubuntu似乎没有释放内存?

来自分类Dev

为什么ubuntu似乎没有释放内存?

来自分类Dev

创建现有字典的副本,但为副本分配唯一的ID

来自分类Dev

创建现有字典的副本,但为副本分配唯一的ID

来自分类Dev

为什么我的循环没有到达文件末尾?

来自分类Dev

为什么不可变列表的浅表副本和深表副本之间没有区别

来自分类Dev

为什么不可变列表的浅表副本和深表副本之间没有区别

来自分类Dev

为什么在“验证”阶段没有复制我的资源?

来自分类Dev

为什么在Laravel中没有执行资源

来自分类Dev

重载副本分配运算符

来自分类Dev

MFC CList是否支持副本分配?

来自分类Dev

此副本分配操作安全吗?

来自分类Dev

为什么EOF(文件末尾)不能在没有'\ n'的行末尾工作?

来自分类Dev

为什么只有当我再次将文本分配回变量时,TrimStart才起作用?

来自分类Dev

如何在副本分配运算符中访问私有变量?

来自分类Dev

为什么这个Ruby条件分配没有被记录?

来自分类Dev

没有变量分配或声明的Javascript属性访问:为什么?

来自分类Dev

为什么这没有分配正确的值?

来自分类Dev

为什么没有在PySpark中分配值?

Related 相关文章

  1. 1

    为什么使用交换来实现副本分配?

  2. 2

    有没有正当理由不从副本分配运算符返回* this?

  3. 3

    为什么我的副本分配运算符从未调用过?

  4. 4

    为什么std :: reference_wrapper显式定义副本分配运算符?

  5. 5

    为什么没有释放内存?

  6. 6

    这两种调用基类副本分配的方式有什么区别?

  7. 7

    这两种调用基类副本分配的方式有什么区别?

  8. 8

    为什么引用类型成员导致隐式声明的副本分配运算符被删除

  9. 9

    为什么在visual studio中实现断点之前没有释放内存时动态分配显示严重错误

  10. 10

    如何避免副本分配运算符出现双重释放或损坏(快捷方式)?

  11. 11

    为什么ubuntu似乎没有释放内存?

  12. 12

    为什么ubuntu似乎没有释放内存?

  13. 13

    创建现有字典的副本,但为副本分配唯一的ID

  14. 14

    创建现有字典的副本,但为副本分配唯一的ID

  15. 15

    为什么我的循环没有到达文件末尾?

  16. 16

    为什么不可变列表的浅表副本和深表副本之间没有区别

  17. 17

    为什么不可变列表的浅表副本和深表副本之间没有区别

  18. 18

    为什么在“验证”阶段没有复制我的资源?

  19. 19

    为什么在Laravel中没有执行资源

  20. 20

    重载副本分配运算符

  21. 21

    MFC CList是否支持副本分配?

  22. 22

    此副本分配操作安全吗?

  23. 23

    为什么EOF(文件末尾)不能在没有'\ n'的行末尾工作?

  24. 24

    为什么只有当我再次将文本分配回变量时,TrimStart才起作用?

  25. 25

    如何在副本分配运算符中访问私有变量?

  26. 26

    为什么这个Ruby条件分配没有被记录?

  27. 27

    没有变量分配或声明的Javascript属性访问:为什么?

  28. 28

    为什么这没有分配正确的值?

  29. 29

    为什么没有在PySpark中分配值?

热门标签

归档