【问题标题】:Why is this code allowed and does it create a memory leak? [duplicate]为什么允许此代码并且它会造成内存泄漏? [复制]
【发布时间】:2021-06-29 17:17:13
【问题描述】:

以下代码崩溃了,但是我很困惑它是如何被允许的。

int* var = new int;
int num = 10;
var = #

std::cout << *var << ", " << num << std::endl;
    
delete var;
    
std::cout << "Program finished" << std::endl;

我更改了var 所指的内容是否会导致内存泄漏?如果是这样,是否会导致从第 3 行开始无法修复的内存泄漏?如果没有,你怎么能删除这段记忆?

【问题讨论】:

  • 内存泄漏,然后是未定义的行为。如果您忘记了new 返回的地址,您将泄漏内存。如果你 delete 不是由 new 分配的东西,你有未定义的行为。
  • 不完全是重复的,该帖子要求删除堆栈分配的变量,这不一定是,它如何解决不再指向该堆分配内存的堆分配变量。 ..

标签: c++ pointers memory heap-memory


【解决方案1】:

C++ 不能保护您免受基本错误的影响。在这种情况下,您在没有new 的情况下调用delete,这通常会导致崩溃。这个故事的寓意是“不要那样做”。

至于内存泄漏,是的,您泄漏了使用new 分配的内存(因为您在重新分配var 时会丢失它的踪迹)。

【讨论】:

  • 是的,对不起。我更新了我的答案。重新分配 var 后,您会忘记它最初指向的内容,因此无法删除它。
  • 当然,除非您将副本保存在某个地方的另一个指针对象中。
  • @NateEldredge 嗯,是的,但我认为关键是发布的代码没有这样做。
猜你喜欢
  • 2019-09-08
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 2011-10-21
  • 2013-05-25
  • 2011-06-17
相关资源
最近更新 更多