没有delete()的new()是Undefined Behavior还是仅仅是Memory Leak?

时间:2012-03-29 07:35:36

标签: c++ memory-leaks new-operator undefined-behavior

  

可能重复:
  Are memory leaks “undefined behavior” class problem in C++?

在C ++程序中,deletedelete[] resp返回的地址永远不会调用newnew []是未定义的行为还是内存泄漏?

欢迎参考标准(如果有)。
其中一条评论here&我对此感到有些困惑。

7 个答案:

答案 0 :(得分:8)

关于newdelete的语义,标准很明确。如果你不打电话delete,肯定没有未定义的行为;事实上,它是单身人士的标准做法,我想std::coutstd::cin使用new[]来获取他们的缓冲区(他们几乎肯定不会delete)。为什么不调用delete是未定义的行为?

什么是未定义的行为是调用delete的错误形式,为free分配的内存调用new,或者通常尝试删除对象而不遵循所需的协议它的分配。

答案 1 :(得分:8)

第4段中的

[basic.life](3.8对象生命周期)告诉:

  

程序可以通过重用对象占用的存储或通过使用非平凡的析构函数显式调用类类型的对象的析构函数来结束任何对象的生命周期。对于具有非平凡析构函数的类类型的对象,程序不需要在重用或释放对象占用的存储之前显式调用析构函数;但是,如果没有对析构函数的显式调用,或者如果没有使用delete-expression(5.3.5)来释放存储,则不应该隐式调用析构函数,并且依赖于生成的副作用的任何程序都会生成由析构函数未定义   行为。

答案 2 :(得分:1)

参考 [basic.stc.dynamic.deallocation] (n3337中又名 3.7.4.2 ),只有4个段落。

  1. operator deleteoperator delete[]应该是类成员或全局范围
  2. operator deleteoperator delete[]
  3. 的valide签名的精确度
  4. delete可用于解除分配的精度,具体取决于new用于分配
  5. 对可能的参数值和调用的影响进行精确处理(即指向此存储的指针现在无效)
  6. 这里绝对没有关于如果分配存储但从未发布过将会发生什么的说明。

    我认为标准不关心这个问题,所以它更像未指定而不是 undefined

答案 3 :(得分:0)

这只是内存泄漏。

但我明确地记得标准说使用newdelete[]new []delete是未定义的行为。 (或与mallocfree

的任意组合

我认为标准没有明确规定如果您未能调用new,则调用delete会导致未定义的行为。此外,运行时如何判断您是否稍后调用delete或者根本不调用它?

我认为标准中没有任何合同可以说 - 如果你做 X ,之后你必须做 Y ,否则就是UB。

答案 4 :(得分:0)

让我们说如果你不打电话删除你的程序仍然有用。但是如果你不删除内存分配,你的程序内存使用量将会持续增长,直到你的程序用完了可用内存(运行时间越长,就越有可能发生这种情况),这将导致在不同的点崩溃并且会非常难以察觉(我认为评论意味着什么是未定义的行为')

答案 5 :(得分:0)

我没有看到释放内存如何导致未定义的行为。 如果你不清理,操作系统仍然知道分配的内存。只要应用程序运行,这将导致资源泄漏。

答案 6 :(得分:0)

如果没有为使用delete/delete[]分配的对象调用new/new[],则会出现资源泄漏。如果构造函数已分配动态内存,则可能是内存泄漏。如果构造函数已经分配了信号量锁定未释放,文件句柄未释放等其他内容可能会发生。

它不会是未定义的行为。