15 c++ new-operator delete-operator
我在代码库中发现了经典的新/删除不匹配错误,如下所示:
char *foo = new char[10];
// do something
delete foo; // instead of delete[] foo;
Run Code Online (Sandbox Code Playgroud)
这有多严重?它是否会导致内存泄漏或错误?有什么后果.我们有一些内存问题,但这似乎不足以解释我们所有的症状(堆损坏等)
编辑:清晰的额外问题
它是否只释放阵列的第一个成员?还是
会让系统失去对阵列的追踪?或
腐败记忆是某种方式?
乍一看,调用delete而delete[]不是非常糟糕:你破坏第一个对象,并引发一些内存泄漏.
但是:然后,delete(或delete[])调用free释放内存.并且free需要其最初分配的地址,以正确释放内存.或者,事情是,在new返回malloc分配的原始地址时,new[]返回不同的地址.
在返回的地址上自由调用new[]会引发崩溃(它会混乱地释放内存).
请参阅这些非常有用的链接以便更好地理解:
http://blogs.msdn.com/b/oldnewthing/archive/2004/02/03/66660.aspx#66782
从这些文章中可以明显看出,为什么调用delete[]而不是删除也是一个非常糟糕的主意.
所以,回答:是的,这是一个非常严重的错误.它破坏了内存(仅在调用第一个对象的析构函数之后).