0

以下は、Cでのスタック構造体の実装です。既存のスタックを破棄し、ヒープに割り当てられているメモリを解放するために、関数(メソッドではない)を作成する必要があります。dispose(stack * s)関数は、破棄されるスタックへのポインターを受け取ります。

typedef struct {
    int allocatedLength;
    int logicalLength;
    int elementSize;
    void *elems;
} stack;

次のようにdispose()関数を実装すると、一部のメモリが解放されなくなりますか?

void dispose (stack *s) {
    free (s->elems);
}

上記の実装では、ヒープ上にさえない、elemsに割り当てられたメモリのみを解放しています。elemsは何かへのポインタであることを覚えておく必要があります。ポインタに割り当てられたメモリを解放するのではなく、何かを解放するべきではありませんか?

4

3 に答える 3

1

あなたは誤解しています:のメモリを解放free(p)しませが、 -pのメモリ、つまり、が指すメモリを解放します。したがって、ポインタを格納した割り当てられたメモリを正しく解放しているので、すべて問題ありません。*pps->elems

この誤称について「ポインタを解放する」と話しているすべての人を、実際には「ポインタを持っているメモリを解放する」と言うべきであるときに、遠慮なく非難してください。

于 2012-07-26T11:04:21.430 に答える
0

何を解放するかは、構造体stackを動的に割り当てるかどうかによって異なります。動的に割り当てない場合は、ポイントしている(動的に割り当てられたメモリ)を解放するだけで済みますelems。まさにあなたがしていることですfree (s->elems);

于 2012-07-26T11:05:35.890 に答える
0

構造体スタックにメモリを割り当てる場合、free()は構造体専用にする必要があります。そのメンバーのためではありません。これは、構造体全体にメモリを割り当てるサンプルプログラムです。free()は、ポインタを構造化するために実行する必要があります。

コメントがなく、free (s->elems);コメントfree (s);が付けられている場合、printfは割り当てられたデータを出力します。構造体のメモリは解放されず、メモリリークが発生します。

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int allocatedLength;
    int logicalLength;
    int elementSize;
    void *elems;
} stack;


void dispose (stack *s) {
    //free (s->elems); 
    free (s);
}

int main()
{

 stack *p = malloc(sizeof(stack));

 if(p == NULL)
    {
            printf("\n Memory Allocation Error\n");
            return 0;
    }

  p->allocatedLength = 10;
  p->logicalLength = 20;
  p->elementSize = 30;

  dispose(p);

  /* This printf is undefined behaviour if stack's ptr is freed. If the elem only freed, then it prints data */
  printf("\n allocatedLength: %d\nlogicalLength:%d\nelementSize:%d", p->allocatedLength, p->logicalLength, p->elementSize);


return 0;
}
于 2012-07-26T11:39:16.570 に答える