1

または他の代替手段を使用することになっていることは知っていますstd::vectorが、ポインターで理解できないことがあります。

ポインター配列を作成する場合:

int* a = new int[100];

のスペースを割り当てる必要100 * sizeof(int)がありますね。

必要がなくなったら、次のようにします。

delete [] a;

1.

これは間違っています:

delete a;

しかし、私が実際にこれを行うと(娯楽プログラムで偶然)、実行時エラー(以下のパート3とは異なります)はトリガーされないようで、プログラムは正常に実行されます(メモリリークの可能性にもかかわらず)。なんで?そして、実際に配列の最初の要素を削除 (解放) しますか?


2.

StackOverflow に関する質問によると、delete[]削除する必要がある配列のサイズを知っています。

しかし、間違ったものを削除するとどうなりますか? (実行時エラーが発生します... codepad.org で表示され、VS2010 でmemory clobbered before allocated block何かが表示Debug Assertion Failedされます。) 要素 1 から 99 を削除 (解放) しないのはなぜですか?

delete [] &a[1]; // or
delete [] (a + 1);

3.

次のコードも示していますmemory clobbered before allocated block。しかし、要素 99 を削除 (解放) しないのはなぜでしょうか? なぜエラーが発生するのですがdelete a、パート 1 と同じようにエラーが発生しないのはなぜですか?

delete &a[99]; //or
delete (a + 99);

C++ 標準は実際に上記のことに対して何が起こるかを述べていますか?

4

2 に答える 2

6
  1. C++ 標準によると、new[]usingで割り当てられたオブジェクトの削除deleteは未定義の動作です。「何もない」ことから、すべての認識を超えてヒープを破損することまで、何でも起こり得ます。システムに大きく依存するため、そのような場合に正確に何が削除されるかを言うのは意味がありません。

  2. 「間違ったこと」を削除することは、未定義の動作です。アロケーターの一般的な実装では、割り当て解除のために渡すアドレスの直前に特定の値が格納されることを想定しているため、通常、これによりヒープが破損します。これは決して標準ではありません。

  3. 要素 99 を割り当てていないため、要素 99 を削除しません。単一の ではなく、100 個のアイテムの配列を割り当てましたint。一度に 100 個のアイテムすべての割り当てを解除する必要があります。他の方法で割り当てを解除することはできません。

于 2013-01-01T06:47:19.993 に答える
4

なんで?そして、実際に配列の最初の要素を削除 (解放) しますか?

いいえ、技術的には、未定義の動作が発生しました。つまり、何でも起こり得るということです。

neworを使用するためのルールnew []は非常に単純です。

  • 使用した場合はを使用newする必要があり、使用する場合は解放deleteに使用new []する必要があります。delete[]
  • newまたはnew []から返されたアドレスを または に渡す必要がありdeleteますdelete []

ルールに従わないと、未定義の動作になります。

なぜこれが?

C++標準がそう言っているからです。
標準では、動的なメモリ割り当てを通じてオブジェクトの有効期間とメモリを管理する機能が提供されます。その見返りとして、この機能を取得するために標準で義務付けられている規則に従う契約を作成します。
契約を破棄すると、ペナルティが発生します。

要するに、

「大きな力には大きな責任が伴う」

于 2013-01-01T06:42:38.207 に答える