我正在使用一个从用户分配给定数量字节的函数,然后我有另一个函数应该释放已分配的内存。内存段用作包含 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中的所有内容,但我不知道该如何去做。
答案 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);
的来电将会出现问题