1

int次のように、オブジェクトのメモリ位置を動的に割り当てた場合:

int *x = new int;

それが終わったら、ヒープ上のメモリを解放したいので、次のようにします。

delete x;

今、私が次のことをしなかった場合

x = NULL;

別のアドレスxを指していますか?更新:代わりに anothermany

私がしなかったと言って、別のx = NULLを作った場合、どうなりますか? delete x;

4

6 に答える 6

6
  1. あなたがそれを削除した後にあなたがすることはすべて未定義ですx= NULL
  2. 二重削除 = 災害。

注: 一部のランタイム システムは、二重削除の特定の非常に単純なケースからユーザーを保護します。詳細によっては、これらのシステムのいずれかで実行していて、処理が異なる別のシステムにコードをデプロイする人がいない場合や、デストラクタを持たないものを削除している場合や、 2 つの削除の間に重要なことは何もしません。また、2 つの削除の間に重要なことを行うためにコードを変更する人が誰もいない場合、およびスレッド スケジューラ (制御できない可能性があります!) がたまたまスレッドをスワップしない場合2 つの削除と if、および if、および if。マーフィーの話に戻りますが、失敗する可能性があるため、最悪の場合に失敗します。

https://isocpp.org/wiki/faq/freestore-mgmt

于 2011-01-29T09:12:05.253 に答える
5

の後、deleteポインタには通常、(現在は空いている)メモリのアドレスが含まれています。2つ目deleteは未定義の動作を与えるので、そうしないでください。

于 2011-01-29T09:12:13.630 に答える
2

未定義の動作を呼び出します。そうしないと、無効なメモリ位置を指していることになり、使用しようとすると未定義の動作が発生しますx=NULLx

于 2011-01-29T09:13:07.913 に答える
2

タイプ:

int main(){
  int* i = new int;
  std::cout << i << std::endl;
  delete i;
  std::cout << i << std::endl;
  delete i;
}

結果:

0x8e19008

0x8e19008

**glibcが検出されました**./a.out:ダブルフリーまたは破損(ファストトップ):0x08e19008 *

ご覧のとおり、アドレスは同じままですが、2回目の削除はランタイムエラーで終了します。動作は詳細には環境によって異なりますが、原則として機能しません。

于 2011-01-29T09:15:53.597 に答える
1

すでに削除されたメモリでdeleteを呼び出すと、未定義の動作が発生します。通常、プログラムはクラッシュします。

xを削除した後、それが指す場所は「コンパイラに依存」します。ほとんどのコンパイラは、deleteが呼び出される前に、それがどこにあったかを指すようにします。ただし、そのメモリアドレスは無効であるため、呼び出さないでください。

これと同じ理由で、「これを削除する」は、必要に応じて、非常に慎重かつ慎重に使用する必要があります。:-)

于 2011-01-29T09:13:18.897 に答える
1

2 番目の削除は未定義です。

補足として、二重削除を検出するツールがあります。最高のものの1つはValgrindです。

于 2011-01-29T09:37:18.157 に答える