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内存为*p——即指向p的内存。因此,您正确地释放了存储指针的分配内存s->elems,一切都很好。

随意责怪每个谈论“释放指针”的人这个用词不当,而实际上他们应该说“释放我有指针的内存”。

于 2012-07-26T11:04:21.430 回答
0

如果您为结构堆栈分配内存,则 free() 应该仅用于结构。不是为了它的成员。这是一个为整个结构分配内存的示例程序。free() 应该用于结构指针 s。

如果free (s->elems);未注释且free (s);已注释,则 printf 打印分配的数据。struct 的内存不会被释放并导致内存泄漏。

#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 回答
0

您将释放什么取决于您是否会stack动态分配结构。如果不动态分配,只需要释放elems所指向的(动态分配的内存)即可。这正是你正在做的free (s->elems);

于 2012-07-26T11:05:35.890 回答