释放分配给指针的内存,释放分配给指针指向的内存

时间:2012-07-26 11:00:57

标签: c pointers

以下是C中的堆栈结构的实现。我需要编写一个函数(不是方法)来处理现有的堆栈并且当然释放堆上为它分配的任何内存。 dispose(stack * s)函数接收一个指向要处理掉的堆栈的指针。

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

如果我按如下方式实现dispose()函数,是否会导致某些内存永远不被释放?

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

在上面的实现中,我只释放分配给elems的内存,它甚至不在堆上。我们需要记住,元素是指向某事物的指针。我们不应该释放那些东西,而不是释放分配给指针的内存吗?

3 个答案:

答案 0 :(得分:1)

你误解了:free(p) 释放p的内存,但*p的内存 - 即内存指向到p 。因此, 正确地释放了在s->elems中存储指针的已分配内存,一切都很顺利。

随意谴责所有谈论“释放指针”的人,因为他们真的应该说“释放我有指针的记忆”。

答案 1 :(得分:0)

您将释放所有内容取决于您是否动态分配结构stack。如果不动态分配它,则只需要elems指向的空闲(动态分配的内存)。这正是您使用free (s->elems);

所做的

答案 2 :(得分:0)

如果要为结构堆栈分配内存,则free()应仅适用于struct。不适合它的成员。这是一个为整个struct分配内存的示例程序。 应该对结构指针s进行free()。​​

如果取消注释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;
}