Oracle® Solaris Studio 12.4: dbx コマンドによるデバッグ

印刷ビューの終了

更新: 2015 年 1 月
 
 

メモリーリークエラー

リーク検査が有効になっている場合、実行時検査では、次の種類のエラーを報告します。

ブロック中のアドレス (aib)

意味: メモリーリークの可能性がある。割り当てたブロックの先頭に対する参照はないが、そのブロック内のアドレスに対する参照が少なくとも 1 つある。

考えられる原因: そのブロックの先頭を示す唯一のポインタが増分された。

例:

char *ptr;
main()
{
   ptr = (char *)malloc(4);
   ptr++;    /* Address in Block */
}

レジスタ中のアドレス (air)

意味: メモリーリークの可能性がある。割り当てられたブロックが解放されておらず、そのブロックへの参照がプログラムメモリー内のどこにも存在しませんが、レジスタ内には参照が存在します。

考えられる原因: この状況は、コンパイラがプログラム変数をメモリー内には保持せず、レジスタ内にのみ保持している場合に正常な状態として発生することがあります。コンパイラは多くの場合、最適化が有効になっているときに、局所変数や関数パラメータに対してこの動作を実行します。最適化が有効になっていないときにこのエラーが発生した場合は、実際のメモリーリークである可能性があります。この状況は、割り当てられたブロックへの唯一のポインタが、そのブロックが解放される前にスコープから外れた場合に発生することがあります。

例:

if (i == 0) {
       char *ptr = (char *)malloc(4);
       /* ptr is going out of scope */
}
  /* Memory Leak or Address in Register */

メモリーリーク (mel) エラー

意味: 割り当てられたブロックが解放されておらず、そのブロックへの参照がプログラム内のどこにも存在しません。

考えられる原因: プログラムが使用されなくなったブロックを解放しなかった。

例:

char *ptr;

    ptr = (char *)malloc(1);
    ptr = 0;
/* Memory leak (mel) */