[解決済み] delete[]が配列であることをどうやって知るのですか?
質問
さて、次のコードで何が起こるかは、渡されたものによって未定義であることに、私たちは皆同意すると思います。
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 は賢いので、1 つの int を削除するだけで、その先のメモリの残りを削除してある種の「殺し合い」に走ることはありません (対照的なのは
strlen
と非
\0
-で終端しない文字列の場合 -- 0になるまで進み続けます)。
では、これらのことを記憶するのは誰の仕事なのでしょうか?OS はバックグラウンドで何らかの記録を保持しているのでしょうか? (つまり、何が起こるかは未定義であると言うことからこの投稿を始めたことは承知していますが、事実は、「殺しまくる」シナリオは起こらないので、したがって、現実の世界では 誰か は記憶しているのです)。
どのように解決するのですか?
コンパイラはそれが配列であることを知らない、プログラマを信頼している。 ポインタを削除すると、1つの
int
と共に
delete []
を使用すると、未定義の動作になります。 2番目の
main()
の例は、たとえすぐにクラッシュしないとしても、安全ではありません。
コンパイラはどのように多くのオブジェクトが削除される必要があるかを追跡する必要があります。 これは、配列のサイズを保存するために十分な量を過剰に割り当てることによって行われるかもしれません。 詳細については C++ スーパー FAQ .
関連
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] 配列からArrayListを作成する
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み】配列に何かを追加する方法は?
-
[解決済み】JavaScriptで配列の要素を削除する - delete vs splice
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】delete[]は、オペランド配列のサイズをどのように「知って」いるのでしょうか?