【问题标题】:delete operator usage when reassigning pointers [closed]重新分配指针时删除运算符的使用[关闭]
【发布时间】:2022-01-17 09:48:22
【问题描述】:

当您将一个指针重新分配给另一个指针时,您是否需要始终删除它, 示例:

int value = 5;
int* ptr{ new int{} }; // allocate memory
ptr = &value; // old address lost, memory leak results

我知道这有助于防止内存泄漏,但在所有情况下都建议这样做。是否有任何情况下在 ptr = &value 之前添加删除将删除一些有用的信息。 欢迎提供有关这种特殊情况的消息

【问题讨论】:

标签: c++ pointers new-operator delete-operator


【解决方案1】:

一般来说,如果你用new分配了一个对象,那么你最终应该使用delete来释放它的内存,而且你应该只这样做一次。在您清除或覆盖程序中指向该对象的最后一个现有指针后,您将没有任何指向该对象的指针,因此您将无法删除它,并且您会遇到内存泄漏(这可能没问题,具体取决于内存有多大、程序需要运行多长时间以及对象的析构函数的作用)。

如果你没有使用new分配对象,而是以其他方式分配它,你应该使用delete删除它。 p>

如果您的程序中还有其他指向该对象的指针,那么当您覆盖其中一个指针时,也许您不需要delete 它。这取决于如何使用其他指针。具体来说:

  • 如果您打算取消引用任何其他指针(即从对象读取或写入),绝对不要delete 对象。
  • 如果您以后要使用指向 delete 对象的其他指针之一,请不要立即删除该对象(因为您应该只删除一次)。

【讨论】:

  • 我没有任何其他指向该对象的指针。并且代码中存在内存泄漏。我肯定会在后面的代码中删除指向该对象的指针。我怎样才能覆盖指针并删除它呢?
  • 你把我弄糊涂了。如果您要覆盖一个指向对象的指针,而您的程序中没有任何其他指向该对象的指针,那么您以后将其删除是不可能的。如果您要覆盖指向使用new 分配的对象的最后一个指针,您应该在覆盖它之前将其删除,如下所示:delete ptr; ptr = something_else;
  • 哦,对不起,我现在看到了。重新分配指针后,将为新指针调用第二次删除。所以不会出现双重删除的情况。对不起,我很困惑,因为变量名是相同的。谢谢
  • 后续问题:我计算出我的对象(这是一个结构)超过 700 个字节。有问题的应用程序运行 12 小时的最佳情况。像这样的对象将来会被认为是一个问题吗?还是这取决于您的程序在应用程序的整个生命周期中实际为此对象分配内存的次数?
  • 是的,内存泄漏的严重程度取决于它发生的频率和大小。每次发生 700 字节的内存泄漏时,程序使用的内存就会膨胀 700 多个字节,最终它可能会占用系统上的很大一部分内存,因为可用的 RAM 较少,因此会减慢其他事情的速度用于缓存或其他用途。如果您不确定,最好只修复泄漏。
猜你喜欢
  • 2013-05-24
  • 2012-11-14
  • 2012-10-26
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
相关资源
最近更新 更多