delete[]
如果在这个例子中正常的delete
不会导致内存泄漏,那么为什么它存在呢?
void foo() {
int* array = new int[10000000];
delete array;
}
int main() {
foo();
}
第一个快照是在程序启动时拍摄的,第二个快照是在第二行代码结果之后拍摄的,第三个快照是在退出时拍摄的foo()
。使用 VS22、编译器 clang 在 Debug 版本中执行了分析,结果与 MSVC 类似。
也许当你改变编译器时,魔法就会给你带来麻烦?
制作一个最简单的类的数组,最主要的是该类在调用析构函数时写入自身。喜欢
创建一个数组
然后
detele[] t;
在下一次执行中将其删除 - asdelete t;
。比较屏幕上的输出(当然,如果您有输出的话,并且没有关于内存转储已重置之类的消息...)并自己决定 - 这是足够的打击吗?...C++ 标准禁止调用
delete
(不使用方括号)从中获得的指针new[]
。事实上,在这个例子中,现在你还没有损坏任何东西,这是你的幸运。但这是被禁止的,因为堆内存可能被破坏,对象析构函数将不会被调用,等等。未定义的行为。7.6.2.9 [expr.delete] 2:
附言为什么它对你来说没坏?因为在您的编译器中唯一的
delete
区别delete[]
是第二个编译器调用数组中对象的析构函数,而第一个编译器则不调用。但对于int
析构函数来说没有区别。但再说一遍:不要这样做,这很糟糕。使用标准语言写作时要遵循标准。