gpt4 book ai didi

c - malloc ,如何在函数中自由返回值

转载 作者:太空宇宙 更新时间:2023-11-04 00:08:35 25 4
gpt4 key购买 nike

我的应用程序在 STLinux (sh4) 中使用,不幸的是 valgrind 不支持 sh4 cpu。因为我看到我的应用程序内存泄漏,所以我使用了 mtrace,它证实了一些内存不是空闲的。问题是,返回中使用了 malloc 变量,因此我不知道如何释放它(因为如果它是自由的,那么在函数中返回就没有意义了)?

我已经编写了 cs_malloc(将来自 oscam-simple.c 的以下代码放在上面的链接中),mtrace 日志说,那行:

*tmp = malloc (size);

内存不是空闲的

 /* This function encapsulates malloc. It automatically adds an error message to the log if it failed and calls cs_exit(quiterror) if quiterror > -1. 
result will be automatically filled with the new memory position or NULL on failure. */
void *cs_malloc(void *result, size_t size, int32_t quiterror){
void **tmp = result;
*tmp = malloc (size);
if(*tmp == NULL){
cs_log("Couldn't allocate memory (errno=%d %s)!", errno, strerror(errno));
if(quiterror > -1) cs_exit(quiterror);
} else {
memset(*tmp, 0, size);
}
return *tmp;
}

然后对于 malloc,我这样调用它:

  // create the AES key entry for the linked list
if(!cs_malloc(&new_entry, sizeof(AES_ENTRY), -1)) return;

请看一下这 3 个函数(malloc 不是免费的,正如其他用户所说,valgrind 声称这些代码会导致内存泄漏 module-datastruct-llist.c

内存泄漏由 3 个不同的部分引起:

  1. 在下面的代码中,“new”永远不会 free ,但由于它用于返回该函数,我不知道如何释放它:

    LL_NODE* ll_append_nolock(LLIST *l, void *obj)
    {
    if (l && obj) {
    LL_NODE *new;
    if(!cs_malloc(&new,sizeof(LL_NODE), -1)) return NULL;
    new->obj = obj;

    if (l->last)
    l->last->nxt = new;
    else
    l->initial = new;
    l->last = new;

    l->count++;
    return new;
    }
    }
  2. “l”也在下面的函数中使用,同样因为它在返回函数中使用,我不知道如何释放它。 :

      LLIST *ll_create()
    {
    LLIST *l = cs_malloc(&l, sizeof(LLIST), 0);
    pthread_mutex_init(&l->lock, NULL);
    return l;
    }
  3. 与新故事相同:

             LL_NODE *ll_prepend(LLIST *l, void *obj)
    {
    if (l && obj) {

    LL_NODE *new;
    if(!cs_malloc(&new,sizeof(LL_NODE), -1)) return NULL;

    new->obj = obj;
    ll_lock(l);
    new->nxt = l->initial;

    l->initial = new;
    if (!l->last)
    l->last = l->initial;
    l->count++;
    ll_unlock(l);

    return new;
    }
    return NULL;
    }

更多功能可以看module-datastruct-llist.c

非常感谢,如果有专家告诉我,我该如何修复内存泄漏(如果您觉得 cs_malloc 应该重写,或者需要添加新功能,请编写您的意思的源代码。

最佳答案

malloc 的最常见实现使用堆内存,它是全局的,因此在最终释放之前在多个函数之间传递一个位置分配的存储空间是很常见的。

现在,例如有对 ll_append_nolock 的调用,您可以在其中忽略 malloced 返回。即

ll_append_nolock(it->l, obj);

所以为了避免泄漏,你需要做你在其他地方做的事情,即让调用函数将分配的内存接收到一个指针中:

LL_NODE *n = ll_append_nolock(l, obj);
/* do stuff with "n", which points to memory allocated under the name of "new" */
free(n);

当您完成 n(如上所述指向以名称"new"分配的存储,即:相同的内存,不同的名称)时,您将释放它。

HTH.

关于c - malloc ,如何在函数中自由返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12921186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com