Col*_*len 1 c++ clang visual-c++
我最近发现代码中有很多地方都是这样的:
int * int_array = new int[1000];
// ... do things with int_array
delete int_array;
Run Code Online (Sandbox Code Playgroud)
问题当然是它应该使用delete []运算符,而不是常规delete运算符.
谜团是:这个代码已经工作了几年,在Windows上由Visual Studio 2003和2005编译,在OS X上编译GCC/clang.为什么这不会导致事情在此之前出现严重错误?
据我所知,我们告诉编译器以"错误"的方式释放内存,通常如果你这样做,会发生一些可怕的事情并且程序崩溃.为什么不发生这种情况?现代编译器会自动为您做"正确的事情",还是对基本类型或其他内容无关紧要?我不能接受我们只是幸运,因为这些代码已被多个不同操作系统下的数千名客户使用多年.
请注意,我并不是在寻找一个做错事的借口,而是试图理解为什么我们没有因为做错而陷入困境.:)
这是未定义行为的本质 - 它可能完全符合您的预期.问题是,对于下一版本的编译器,操作系统,库或CPU ......它可能会做一些完全不同的事情.
最有可能的是,你摆脱它有两个原因:
int没有析构函数.因此,无法正确销毁阵列中的每个元素都没有后果.
在这个平台上,new并new[]使用相同的分配器.因此,您不会将块返回给错误的分配器.