よし、次のコードで何が起こるかは未定義であることに誰もが同意すると思う。
void deleteForMe(int* pointer)
{
delete[] pointer;
}
ポインターはあらゆる種類のものである可能性があるため、無条件で実行するdelete[]
ことは未定義です。ただし、実際に配列ポインターを渡していると仮定しましょう。
int main()
{
int* arr = new int[5];
deleteForMe(arr);
return 0;
}
私の質問は、ポインタが配列であるこの場合、これを知っているのは誰ですか? つまり、言語/コンパイラの観点からarr
は、配列ポインターか単一の int へのポインターかどうかはわかりません。arr
一体、動的に作成されたかどうかさえわかりません。それでも、代わりに次のことを行うと、
int main()
{
int* num = new int(1);
deleteForMe(num);
return 0;
}
OS は、int を 1 つだけ削除し、その時点以降のメモリの残りを削除することによって、ある種の「大量殺戮」を行わないほど十分にスマートです (これを終了しstrlen
ていない\0
文字列と比較してください。ヒット 0)。
では、これらのことを覚えるのは誰の仕事でしょうか? OS は何らかの種類の記録をバックグラウンドで保持していますか? (つまり、何が起こるかは未定だと言ってこの投稿を始めたことに気づきましたが、実際には、「殺戮」シナリオは起こらないので、実際の世界では誰かが覚えています。)