我最近發現,在我們的代碼有很多地方都在做這樣的事情:爲什麼應該要求數組刪除操作符時,常規刪除操作符是否工作?
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時,一直在用字面上的年代工作。爲什麼這不會在現在變得非常糟糕?
據我所知,我們告訴編譯器將內存釋放爲「錯誤」的方式,通常如果你這樣做,會發生一些可怕的事情,並且你的程序崩潰。爲什麼這不是爲我們發生的?現代編譯器會自動地爲你「做正確的事情」,還是足夠的正確的事情,對基本類型或其他事情無關緊要?我不能接受我們很幸運,因爲這個代碼已經被多個不同的操作系統使用了數千個客戶,這些代碼已經使用了好幾年了。
請注意,我不是要求錯誤的理由,只是想明白爲什麼我們不會因爲做錯事而麻煩。 :)
未定義的行爲未定義。 – chris
大部分軟件都包含很多缺陷和未定義的行爲,這些行爲並不表現爲實際的外部可觀察問題。 –