-3

何が良くて何が悪い?どのような場合に、メモリ リークを防ぐために delete を呼び出す必要がありますか? また、動作は C と C++ でまったく同じですか? 違いはありますか?

const char* a = "blahblah";
...
delete a;

char b* = new char('a');
...
delete b;

char c[100] = "blahblah";
...
delete c;

char d* = new char[40];
...
delete d;

char e* = new char[40];
...
delete[] e;
4

7 に答える 7

11

その場合、メモリリークを防ぐために削除を呼び出す必要がありますか

deleteあなたが得たものnewdelete []あなたが得たものだけnew []。他のすべての削除は間違っています。

于 2013-02-21T19:54:10.163 に答える
3

それらはすべて間違っています。C ++プログラムを呼び出さないでくださいdelete(スマートポインターなどのメモリ管理プリミティブを直接実装している場合を除く)。リソースの破棄を処理するには、常にスマートポインターを使用してください。配列の場合は、のようなコンテナを使用しますstd::vector<T>。文字列には、専用std::stringのクラスがあります。最後に、 (スマートポインターを介して)直接または正しく(スマートポインターを介して)にnew適したオブジェクトを作成することを除いて、原始的な状況はありません。したがって、明示的にそのような関数を使用または呼び出さなかった場合(実際にはスマートポインターを返す必要があります... )、あなたは間違いなくそれを間違っています。deletenew

  1. 削除する動的メモリがないため、間違っています。
  2. スマートポインタを使用する必要があるため、間違っています(ここでは問題ないようunique_ptrに見えます)。
  3. 1と同じ。
  4. std::vector動的に割り当てられたアレイが必要なため、間違っています。
  5. 4と同じ。
于 2013-02-21T19:58:51.943 に答える
3

ルールは簡単です:

  • delete呼び出していないポインタは使用しないでくださいnew
  • 割り当てたすべてのものに使用delete[]しますnew[]
  • delete割り当てたものすべてに (括弧なし) を使用(括弧newなし)

bこれらの規則に従うと、との削除のみeが有効であることがわかります。

  • ac割り当てられていないnew
  • dが必要ですdelete[]
  • bそしてe正しいです。
于 2013-02-21T19:55:48.710 に答える
2

また、動作はCとC ++でまったく同じですか?違いはありますか?

Cにはありませんdeleteし、Cにもありませんnew。のみfreeに対応しmallocます。

于 2013-02-21T20:07:55.537 に答える
2

従うべき3つのルール:

  1. newと一緒に行くdelete;
  2. new[]と一緒に行くdelete[];
  3. 2013年以降に安全で堅牢な慣用的なコードを記述したい場合は、スマートポインターの実装を使用してください(その結果new、スマートポインターコンストラクターの引数で使用し、使用しないことになりますdelete)。
于 2013-02-21T20:18:52.700 に答える
1

new/new[]ルールは、対応する を使用する必要がある場合ですdelete/delete[]

于 2013-02-21T19:55:24.923 に答える
1
delete b;
delete[] e;

これらは唯一の正しい削除です。

経験則として:

  • それぞれnewに対応するdelete
  • それぞれnew … []に対応するdelete []

これらのルールでは、例外処理は考慮されていません。コードの例外を安全に保つには、スマート ポインターを使用します。std::string「文字列」を意味するときに使用します。

于 2013-02-21T19:55:48.940 に答える