gpt4 book ai didi

c - 由于看似必要的 malloc 重复而导致内存泄漏

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

我有以下结构:

typedef struct pair {
int *key; // search key for this item
int *count; // pointer to data for this item
struct pair *next; // children
} pair_t;

typedef struct counters {
struct pair *head;
} counters_t;

我有以下功能:

static pair_t * // not visible outside this file
pair_new(const int key)
{

pair_t *pair = malloc(sizeof(pair_t));

free(pair->key);
free(pair->count);

if (pair == NULL) {
// error allocating memory for pair; return error
return NULL;
} else {

pair->key = malloc(sizeof(int));
pair->count = malloc(sizeof(int));

*(pair->key) = key;
*(pair->count) = 1;
pair->next = NULL;
return pair;

}
}

请注意,我首先为 pair 分配内存,检查内存是否已正确分配,然后如果是,我将值分配给 pair 实例的元素。为了给这些元素(键和计数)赋值,我必须为它们(元素)分配内存。稍后在我的主程序中调用删除函数:

(ctrs 是对的链表)

void counters_delete(counters_t *ctrs){
if(ctrs!=NULL){
pair_t *temp = ctrs->head;
while(temp!=NULL){
printf("freeing for key %d\n",*(temp->key));
free(temp->count);
free(temp->key);
temp = temp->next;
}
ctrs->head=NULL;
}
return;
}

其中我释放每对的 key 并计数。

因为我分配了一对的完整大小,然后再次分配了每对的元素,所以我留下了程序结束时尚未释放的内存。我该如何解决这个问题?

最佳答案

首先,删除

free(pair->key);
free(pair->count);

malloc() 之后,因为在内存管理函数未返回的指针上调用 free() 调用 undefined behavior .

就是说,一开始,您为原始变量和成员 malloc() 编辑,最后,您只释放指针成员 key 和结构变量的 count,但实际变量 temp 仍然分配。这就是导致泄漏的原因。

您还必须释放 temp

关于c - 由于看似必要的 malloc 重复而导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38479492/

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