C++标准上规定的是:new出来的空间,必须由delete释放,new []出来的空间,必须由delete[] 释放。如果混用,会导致未定义行为。
所谓未定义行为顾名思义,C++标准中未定义,结果可能很正常,也可能不对头,甚至可能让你的程序崩溃。
实际上部分编译器中,一般情况下你一定程度的混用也是ok的(但也仅限于简单数据,如果是重载了operator new[]/delete[]的代码,可能导致灾难性的后果),但不代表所有编译器都如此,因为这个不是C++标准上的规定。所以强烈建议不应混用delete和delete[],必须和new/new[]配对使用。
参见C++大师Marshall Cline写的C++FAQ中16.11章节:
对于分配的基本数据类型空间时,delete和delete[]是一样的;
但对于自己定义的类,当用new[]分配空间时,delete只会释放第一个,而delete[]则会释放所有。
所以,简单点说,记住这个使用原则:new 和 delete配套使用,new[] 和 delete[] 配套使用。
在C++中new和delete是一组开辟/删除单个空间,new[]和delete[]是一组开辟/删除连续多个空间。不能混用的,会产生不可预知的后果。