0

temp = p_long; メモリリークを示しています。メモリリークがどのように発生するのかわかりません。

long *temp = NULL; 
for (int i = 1; i < 10; i++) {
  if (i < 3) {
     long *p_long = new long;

     if ( p_long ) {
        if ( 0 == *p_long ) {
           flag = true;
        } else if ( 1 == *p_long ) {
           temp = p_long;                    -----> showing memory leak here
           continue;
        }
     }
  }
}

if (temp)
delete temp;

ありがとう。

4

3 に答える 3

2

ヒープ割り当てを解放していません。long *p_long = new long;これがループであることを考慮すると、forいくつかのメモリ ブロックが孤立することになります ( newed が、delete-ion でそれらを参照するポインタはもうありません)。

p_longに割り当てられていない場合は、ループの適切な部分で解放する必要がありますtemp。あなたのcontinue発言は冗長です (もしかしたらあなたが意図したのbreakですか?)。また、の現代版NULLnullptr.

もう 1 つのポイントは、if ( p_long )チェックは基本的に、そのタイプ ( )NULLの現在のnewヒープ アロケーターに割り当てのlong問題 (メモリ不足など) があった場合にのみ行われることであり、以下if ( 0 == *p_long )では、新しく割り当てられたヒープlongが自動的に初期化されたことを確認しています。の値0。C ++では、必要なものに対してのみパフォーマンスを支払うため、これは当てはまりません。値は未定義です (実際には、おそらくそのメモリ アドレスに存在する改ざんされていない値になります)。

于 2013-05-28T09:32:03.670 に答える
0
long *temp = NULL; 
for (int i = 1; i < 10; i++) {
  if (i < 3) {
     long *p_long = new long;

     if ( p_long ) {
        if ( 0 == *p_long ) {
           flag = true;
        } else if ( 1 == *p_long ) {
           if(temp)
              delete temp; -----> leaked memory freed here
           temp = p_long;                   
           continue;
        }
     }
  }
}
于 2013-05-28T09:33:37.760 に答える