假设我正在为库实现通用堆栈结构。这是一个示例块:
typedef struct stack
{
void* key;
struct stack* next;
void*(*alloc_fn)(void*);
} stack;
static stack* make_stack_node(void* val, stack* next,
void*(*f)(void*))
{
stack* node = malloc(sizeof(stack));
if (!node) {
return NULL;
}
node->key = f(val);
node->next = next;
node->alloc_fn = f;
return node;
}
堆栈存储一个函数指针,该函数指针指向由用户指定并用于分配的函数。 make_stack_node
只接受该功能。一堆int
s:
static void* alloc_stack(void* val)
{
int* p = malloc(sizeof(int));
*p = *(int*)val;
return p;
}
我的问题是:当我malloc
node
的{{1}}内存以及之后make_stack_node
int
为alloc_stack
分配内存时,我是分配太多了?制作node->key = f(val);
时是否有内存泄漏?
我相信,因为我认为在node->key
的分配期间已经分配了node
的内存,所以当我为int*
分配内存并将该分配给{ {1}},是否泄漏了前一个node->key
指向的内容?
答案 0 :(得分:4)
您没有为int*
分配内存,而是为int
分配内存。不,如果你释放内存,就没有内存泄漏。
为stack
分配内存时,key
并未指明具体内容。这是一个未定义的指针,你不能解除引用。您需要为它分配内存以指向您正在执行的操作(或将其设置为指向已分配的内存)。
答案 1 :(得分:2)
制作
node->key = f(val);
时是否有内存泄漏?
当您在node->key
中分配给make_stack_node
时,node->key
还没有指向任何内容,因此没有内存泄露。
如果您稍后要在程序中分配给node->key
,则需要先调用free(node->key)
,以避免在调用alloc_stack
期间泄露make_stack_node
分配的内存}。