是否分配了额外的内存并且是否存在内存泄漏?

时间:2016-07-08 18:23:47

标签: c memory-management memory-leaks

假设我正在为库实现通用堆栈结构。这是一个示例块:

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 intalloc_stack分配内存时,我是分配太多了?制作node->key = f(val);时是否有内存泄漏?

我相信,因为我认为在node->key的分配期间已经分配了node的内存,所以当我为int*分配内存并将该分配给{ {1}},是否泄漏了前一个node->key指向的内容?

2 个答案:

答案 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分配的内存}。