私のアプリは 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」を使用していますが、これもreturn関数で使用しているため、解放する方法がわかりません。:
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を書き直す必要がある、または新しい関数を追加する必要があると感じた場合は、意味するソースコードを書いてください.