我最近发现我们代码中的很多地方都在做这样的事情:
int * int_array = new int[1000];
// ... do things with int_array
delete int_array;
问题当然是它应该使用delete []
运算符,而不是常规delete
运算符。
谜团是:这段代码在 Windows 上由 Visual Studio 2003 和 2005 编译,在 OS X 上由 GCC / clang 编译时,已经运行了好几年。为什么这之前没有导致事情发生严重错误?
据我了解,我们告诉编译器以“错误”的方式释放内存,通常如果你这样做,会发生可怕的事情并且你的程序崩溃。为什么这不会发生在我们身上?现代编译器是否会自动为您“做正确的事情”,或者是否足够正确的事情对基本类型无关紧要,或者其他什么?我不能接受我们只是运气好,因为这段代码已经使用了多年,在多种不同的操作系统下被成千上万的客户使用。
请注意,我不是在为做错事找借口,只是想了解为什么我们不会因为做错事而陷入困境。:)