-1

したがって、malloc はスタックではなくヒープに適用されることがわかっています。

いくつかの質問を聞きたいんです:

このコードのいずれかが割り当てられたり解放されたりしますか?

free ステートメントが表示されないので、何も解放されていないと思いますので、メモリ リークは正しいですか?

念のため、ptr を解放しようとすると、クラッシュします。ハンドルを解放しようとすると、正常に動作します。

  int num;
        int *ptr;
        int **handle;

        num = 14;
        ptr = (int *)malloc(2 * sizeof(int));
        handle = &ptr;
        *ptr = num;
        ptr = #
        handle = (int **)malloc(1 * sizeof(int **));
4

3 に答える 3

6

はい、このコードはmalloc呼び出しを使用してメモリを割り当てます。ptr最後に解放しようとするとクラッシュが発生しますが&num、スタックに割り当てられていて解放できない に再割り当てされているためです。スタック変数の割り当てを解除するのは意味がないだけでなく (とにかく関数の終了時に破棄されるため)、明示的に割り当てられていないため、そうするのも合法ではありません。handle割り当てられたヒープローカルストレージをまだ指しているため、まだ解放できます。

あなたの他の質問に答えるために、はい、メモリリークがありました。さらに、ptrは別の場所を指すように設定されているため、元のアドレスがわからないため、指していた元のメモリを解放することはできなくなりました。

于 2013-02-18T10:08:48.167 に答える
1

はい、malloc解放されていないものを使用してメモリを割り当てるため、リークがあります。malloced メモリのアドレスを のアドレスで上書きしたためptrnum解放できません。最初に割り当てられたメモリのアドレスが失われるため、これはリークです。

于 2013-02-18T10:11:09.747 に答える
1

解放が行われない場合は、メモリ リークが発生しています。( で確認してくださいvalgrind)

解放できないptrスタック変数メモリ領域 (命令を参照) を指しているため、ptr = #解放できません。

于 2013-02-18T10:11:20.600 に答える