不匹配new []和删除,为什么没有内存泄漏?

时间:2017-04-28 06:52:55

标签: c++ memory-leaks delete-operator

new[]delete而不是delete[]合并时,究竟发生了什么?我尝试了以下代码,发现没有内存泄漏,为什么delete返回指针上的new[]不会导致泄漏?

编译器如何知道要释放的字节数?

int main() {
  constexpr int size = 102400;
  while (1) {
    char* buffer = new char[size]{};
    delete buffer;
  }

  return 0;
}

2 个答案:

答案 0 :(得分:4)

正式程序行为未定义,因为您需要将new[]delete[]匹配。

但是,未定义行为的一种可能表现形式是编译器“玩得好”,并按照您的意图行事。 (我使用的编译器之一就是这样,并构成其文档的一部分。)

但是不要依赖于你不会编写严格的可移植C ++。

另请注意,您可能无法观察内存泄漏,因为C ++运行时库和操作系统在您使用它之前可能实际上不会为您提供内存。编译器甚至可以完全优化你的循环 - 因为它是一个无操作 - 特别是如果内存分配和释放调用被正确写入。

答案 1 :(得分:0)

如果启用了优化,则编译器可以删除您的while循环或内部分配和内存释放。否则如上所述,您的程序有不确定的行为。