以下是C中的堆栈结构的实现。我需要编写一个函数(不是方法)来处理现有的堆栈并且当然释放堆上为它分配的任何内存。 dispose(stack * s)函数接收一个指向要处理掉的堆栈的指针。
typedef struct {
int allocatedLength;
int logicalLength;
int elementSize;
void *elems;
} stack;
如果我按如下方式实现dispose()函数,是否会导致某些内存永远不被释放?
void dispose (stack *s) {
free (s->elems);
}
在上面的实现中,我只释放分配给elems的内存,它甚至不在堆上。我们需要记住,元素是指向某事物的指针。我们不应该释放那些东西,而不是释放分配给指针的内存吗?
答案 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;
}