1

char 配列の new と delete の間に巨大なコードがあると、なぜ問題になるのでしょうか。

void this_is_bad() /* You wouldn't believe how often this kind of code can be found */
{
  char *p = new char[5];    /* spend some cycles in the memory manager */
  /* do some stuff with p */
  delete[] p;      /* spend some more cycles, and create an opportunity for a leak */
}
4

8 に答える 8

8

誰かが例外をスローする可能性があるためです。
誰かがリターンを追加するかもしれないからです。

newとdeleteの間にたくさんのコードがある場合、throw / returnの前にメモリの割り当てを解除する必要があることに気付かないかもしれませんか?

コードにRAWポインタがあるのはなぜですか。
std::vectorを使用します。

于 2009-07-30T16:50:39.660 に答える
5

あなたが参照している記事は、

 char p[5]; 

この場合も同様に効果的であり、漏れの危険はありません。

一般に、割り当てられたメモリのライフサイクルを非常に明確にすることでリークを回避し、新規と削除が関連していることがわかります。

2つの間の大きな分離はチェックするのが難しく、削除をかわす可能性のあるコードからの方法があるかどうかを慎重に検討する必要があります。

于 2009-07-30T16:50:13.357 に答える
2

そのコードのリンク(およびソース)は、そのコードでのヒープの不必要な使用を嘆いています。一定の少量のメモリの場合、スタックに割り当てない理由はありません。

代わりに

void this_is_good()
{
   /* Avoid allocation of small temporary objects on the heap*/
   char p[5];    /* Use the stack instead */
   /* do some stuff */
}

ただし、元のコードには本質的に問題はありませんが、最適とは言えません。

于 2009-07-30T16:50:38.160 に答える
1

その特定の例は、new と delete の間に大量のコードを配置することが必ずしも悪いことであると述べているわけではありません。ヒープを使用しないコードを記述する方法がある場合は、ヒープの破損を避けるためにそれを好むかもしれないと述べています。

適切なアドバイスです。ヒープの使用量を減らせば、ヒープが壊れたときにどこを見ればよいかがわかります。

于 2009-07-30T18:45:46.353 に答える
0

変数のnewとdeleteの間に大量のコードがあることは問題ではないと私は主張します。newを使用するという考え方は、ヒープに値を配置して、それを長期間存続させることです。これらの値に対してコードを実行させることは、期待される操作です。

newとdeleteの間に同じメソッド内に大量のコードがある場合に問題が発生する可能性があるのは、次の理由で誤って変数をリークする可能性です...

  • スローされる例外
  • 非常に長くなるメソッドでは、開始または終了が表示されないため、削除呼び出しをスキップしたことに気付かずに、途中から任意に戻り始めます。

これらは両方ともstd::vector<char>、new/deleteペアの代わりになどのRAIIタイプを使用して修正できます。

于 2009-07-30T16:49:21.610 に答える
0

「巨大なコード」を想定すると、そうではありません。

  1. 常に「delete[]p;」を実行します 「p=newchar[size];」を呼び出す前 または「例外をスローします。」
  2. 常に「p=0;」を実行します 「delete[]p;」を呼び出した後

最初の条件を満たさないと、pの内容がリークします。2番目の条件を満たさない場合、二重削除が発生する可能性があります。一般に、問題を回避するために、std::vectorを使用するのが最善です。

于 2009-07-30T16:51:13.510 に答える
-1

これが良いかどうか尋ねていますか?

void this_is_great()
{
   char* p = new char[5];
   delete[] p;
   return;
 }

そうではありません。

于 2009-07-30T16:51:47.037 に答える