了解しました。渡された内容によっては、次のコードで何が起こるかは未定義であることに私たちは皆同意していると思います。
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は何らかのタイプの記録をバックグラウンドで保持しますか?(つまり、何が起きるかは未定義であると言ってこの投稿を始めたことを私は理解していますが、実際、「殺害酒宴」シナリオは発生しないため、実際の世界では誰かが覚えています。)