将new[]
与delete
而不是delete[]
合并时,究竟发生了什么?我尝试了以下代码,发现没有内存泄漏,为什么delete
返回指针上的new[]
不会导致泄漏?
编译器如何知道要释放的字节数?
int main() {
constexpr int size = 102400;
while (1) {
char* buffer = new char[size]{};
delete buffer;
}
return 0;
}
答案 0 :(得分:4)
正式程序行为未定义,因为您需要将new[]
与delete[]
匹配。
但是,未定义行为的一种可能表现形式是编译器“玩得好”,并按照您的意图行事。 (我使用的编译器之一就是这样,并构成其文档的一部分。)
但是不要依赖于你不会编写严格的可移植C ++。
另请注意,您可能无法观察内存泄漏,因为C ++运行时库和操作系统在您使用它之前可能实际上不会为您提供内存。编译器甚至可以完全优化你的循环 - 因为它是一个无操作 - 特别是如果内存分配和释放调用被正确写入。
答案 1 :(得分:0)
如果启用了优化,则编译器可以删除您的while循环或内部分配和内存释放。否则如上所述,您的程序有不确定的行为。