尝试释放以前的malloc时出错

时间:2016-09-01 01:24:52

标签: c

我正在使用一个从用户分配给定数量字节的函数,然后我有另一个函数应该释放已分配的内存。内存段用作包含 x 大小相同的列表节点的池。

初始功能:

search_strings <- c("Black","Grey","Green")
target_string <- "FooBlackBlahGreenBleh"

头文件的number_of_nodes,header和mem_block分别为int,list_node *和char *。

我在头文件中也有一个list_node结构:

void create_mem(int mem_size, int num_n){
     number_of_nodes = num_n;
     mem_block = malloc(mem_size);
     header = mem_block;
}

删除功能:

typedef struct list_node {
     list_node* next;
}list_node;

列表有效,我的代码包含可正常工作的insert_nodes和delete_nodes,但每当我的main调用delete_mem函数时,程序崩溃。

当我将delete_mem函数更改为:

void delete_mem(){
     free(mem_block);
}

我没有错误,但我不认为这个删除功能实际上做了我想要它做的事。

我相信在尝试释放内存之前我需要删除原始mem_block中的所有内容,但我不知道该如何去做。

2 个答案:

答案 0 :(得分:2)

你倒退了。首先NULL变量意味着泄漏内存,然后free(NULL)free(NULL)是合法的,但它是无操作的;因为你丢失了指针的踪迹,所以修复泄漏已经太晚了。使用:

void delete_mem(){
     free(mem_block);
     mem_block = NULL;
}
首先

free,然后NULL出来。

我不知道mem_block中可能包含什么,但如果它包含指向其他已分配内存的指针,则需要对其“拥有”的任何指针执行深度优先遍历, free在离开“四肢”之前,你会留下外部的“叶子”,所以你不会free记忆,直到存储在其中的所有指针都被free编辑。

答案 1 :(得分:0)

确保在malloc之后变量mem_block的值没有改变。

如果发生变化,free(mem_block);的来电将会出现问题