我的应用程序在 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 个不同的部分引起:
在下面的代码中,“new”永远不会释放,但由于它使用该函数作为回报,我不知道如何释放它:
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; } }
在下面的函数中也使用“l”,再次因为它在返回函数中使用,我不知道如何释放它。:
LLIST *ll_create() { LLIST *l = cs_malloc(&l, sizeof(LLIST), 0); pthread_mutex_init(&l->lock, NULL); return l; }
与 new 相同的故事:
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 ,或者需要添加新功能,请编写你想要的源代码。