私は最近、私たちのコードの多くの場所が次のようなことをしていることを発見しました:
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 でコンパイルされたとき、文字通り何年もの間機能していました。
私が理解しているように、コンパイラに「間違った」方法でメモリの割り当てを解除するように指示しています。通常、そうすると、何かひどいことが起こり、プログラムがクラッシュします。なぜこれが起こらないのですか?現代のコンパイラは自動的に「正しいことをする」のでしょうか、それとも基本的な型やその他の何かにとって問題にならないほど十分に正しいことでしょうか? このコードは何年にもわたって使用されており、複数の異なるオペレーティング システムで何千もの顧客によって使用されてきたため、単純に幸運だったとは言えません。
間違ったことをする言い訳を求めているのではなく、間違ったことをしても問題にならない理由を理解しようとしているだけです。:)