【问题标题】:Is extra memory being allocate and is there a memory leak?是否分配了额外的内存,是否存在内存泄漏?
【发布时间】:2016-07-08 18:23:47
【问题描述】:

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

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 仅使用该功能。 ints 堆栈示例:

static void* alloc_stack(void* val)
{
    int* p = malloc(sizeof(int));
    *p = *(int*)val;
    return p;
}

我的问题是:当我为make_stack_node 中的node 分配内存时,当我为alloc_stack 中的int 分配内存时,我是否分配了太多?制作node->key = f(val); 时是否存在内存泄漏?

我相信是这样,因为我认为node->key 的内存在分配node 的过程中已经分配了,所以当我为int* 分配内存并将该块分配给node->key 时,不会泄露了node->key 指向的前一个东西?

【问题讨论】:

  • 不需要使用分配函数来分配节点吗?你也不需要释放函数吗?

标签: c memory-management memory-leaks


【解决方案1】:

您不是为int* 分配内存,而是为int 分配内存。不,只要释放内存,就不会发生内存泄漏。

当您为stack 分配内存时,key 不会指向任何特定的地方。这是一个未定义的指针,您不能取消引用。您需要为其分配内存以指向您正在执行的方式(或将其设置为指向已分配的内存)。

【讨论】:

  • 因此,在 API(不是用户)提供的释放函数中,它基本上迭代堆栈 's' 并执行 'free(s);'对于所有节点,这足以释放所有分配的内存。还是我错了?
  • @DeiDei 你需要释放你分配的所有内存,所以你需要释放指针key以及s
【解决方案2】:

我在做node->key = f(val);的时候有内存泄漏吗?

当你在make_stack_node 中分配给node->key 时,node->key 还没有指向任何东西,所以没有内存泄漏。

如果您稍后在程序中分配给node->key,则需要先调用free(node->key),以避免在调用make_stack_node 期间泄漏alloc_stack 分配的内存。

【讨论】:

    猜你喜欢
    • 2011-01-29
    • 2011-05-08
    • 2012-09-13
    • 2020-07-22
    • 2010-10-13
    • 2019-01-28
    • 2015-02-07
    • 2011-06-26
    • 2011-10-07
    相关资源
    最近更新 更多