1. ホーム
  2. c

[解決済み] ダングリングポインタとメモリリークの違い

2023-06-14 06:30:02

質問

ダングリングポインタとメモリリークの違いがよくわかりません。この 2 つの用語はどのように関連しているのですか?

どのように解決するのですか?

A ダングリングポインタ は既に解放されたメモリを指しています。そのストレージはもう割り当てられていません。アクセスしようとすると、Segmentation faultが発生する可能性があります。

ダングリングポインタの一般的な終わり方。

char *func()
{
   char str[10];
   strcpy(str, "Hello!");
   return str; 
}
//returned pointer points to str which has gone out of scope. 

ローカル変数であったアドレスを返しているので、呼び出し元の関数に制御が戻されるまでにスコープ外に出てしまったのでしょう。 (未定義の動作)

もうひとつのよくあるダングリングポインタの例は、ポインタを使ったメモリ位置へのアクセスで、freeが終了した後に 明示的に が呼び出された後に、ポインタを介してメモリにアクセスすることです。

int *c = malloc(sizeof(int));
free(c);
*c = 3; //writing to freed location!


A メモリリーク とは、解放されていないメモリで、今はもうアクセスする方法がない(解放する方法がない)ものです。(例: ポインタが であった であったポインタは、あるメモリ位置への唯一の参照である 動的に割り当てられた (そして解放されていない)今どこか他の場所を指しています)。

void func(){
    char *ch = malloc(10);
}
//ch not valid outside, no way to access malloc-ed memory

Char-ptr ch はローカル変数で、関数の最後でスコープ外になり、動的に確保された 10バイト .