gpt4 book ai didi

c - C 中的堆没有释放

转载 作者:行者123 更新时间:2023-11-30 16:56:09 25 4
gpt4 key购买 nike

这是我的代码片段,当我尝试释放分配的内存时遇到错误。

int main()
{
int value = 10;
totValues = pow(2, value);
head = (node_t *)calloc(totValues, sizeof(node_t));
createNode(head, 10, 20);
free(head);
}

void createList(node_t *head, int tag, int index)
{
node_t temp = (node_t) calloc(1, sizeof(sizeof(node_t)));
temp->tag = tag;
temp->next = head[index];
head[index] = temp;
free(temp);
}

我正在尝试释放头节点和临时节点,但这不起作用并且我看到错误。我正在使用 valgrind 跟踪内存泄漏。不确定我做错了什么。

最佳答案

您的示例中存在一些问题。下面是经过一些修复的代码:

#include <math.h>
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>

typedef struct node {
int tag;
struct node* next;
} node_t;

void createList(node_t**, int, int);

int main(int argc, char** argv)
{
int value = 10;
int totValues = (int)pow(2, value);
// `head` is an array of `node_t` pointers
// (aka. it is a `node_t**` not a `node_t*`)
node_t** head = (node_t**)calloc(totValues, sizeof(node_t*));
createList(head, 10, 20);
free(head);
return 0;
}

void createList(node_t **head, int tag, int index)
{
// You don't want `sizeof(sizeof(node_t))` because that is
// equivalent to sizeof(size_t) which is implementation defined,
// but usually equal to 4 or 8 depending on word size.
node_t* temp = (node_t*)calloc(1, sizeof(node_t));
temp->tag = tag;
temp->next = head[index];
head[index] = temp;
// You fill `temp` with information, point a spot in `head` to
// that pointer and then free the memory...
// That makes no sense. Don't do it!
free(temp);
}

重要的是要记住,free 不会递归地释放双指针的内存:您需要自己执行此操作。

您应该在 head 中的每个节点上调用 free,然后在 head 本身上调用:

createList(head, 10, 20);
free(head[20]); //Free the one node we created
free(head); // Free the array of nodes we created

并确保注释掉或删除 createList 函数中的 free(temp); 调用。

当您对此运行 valgrind 时,不会再出现内存泄漏。

==6322== Memcheck, a memory error detector
==6322== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==6322== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==6322== Command: ./dynamic_memory
==6322==
==6322==
==6322== HEAP SUMMARY:
==6322== in use at exit: 0 bytes in 0 blocks
==6322== total heap usage: 2 allocs, 2 frees, 8,208 bytes allocated
==6322==
==6322== All heap blocks were freed -- no leaks are possible
==6322==
==6322== For counts of detected and suppressed errors, rerun with: -v
==6322== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

关于c - C 中的堆没有释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40031168/

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