新/删除操作符不匹配错误有多严重?

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)

这有多严重?它是否会导致内存泄漏或错误?有什么后果.我们有一些内存问题,但这似乎不足以解释我们所有的症状(堆损坏等)

编辑:清晰的额外问题
它是否只释放阵列的第一个成员?还是
会让系统失去对阵列的追踪?或
腐败记忆是某种方式?

cni*_*tar 18

它是未定义的行为严重(它可能工作,它可能崩溃,它可以做其他事情).

  • 未定义 - 即取决于编译器/ OS. (2认同)

use*_*631 9

乍一看,调用deletedelete[]不是非常糟糕:你破坏第一个对象,并引发一些内存泄漏.

但是:然后,delete(或delete[])调用free释放内存.并且free需要其最初分配的地址,以正确释放内存.或者,事情是,在new返回malloc分配的原始地址时,new[]返回不同的地址.

在返回的地址上自由调用new[]会引发崩溃(它会混乱地释放内存).

请参阅这些非常有用的链接以便更好地理解:

http://blogs.msdn.com/b/oldnewthing/archive/2004/02/03/66660.aspx#66782

http://web.archive.org/web/20080703153358/http://taossa.com/index.php/2007/01/03/attacking-delete-and-delete-in-c

从这些文章中可以明显看出,为什么调用delete[]而不是删除也是一个非常糟糕的主意.

所以,回答:是的,这是一个非常严重的错误.它破坏了内存(仅在调用第一个对象的析构函数之后).