Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试释放以前的malloc时出错_C - Fatal编程技术网

尝试释放以前的malloc时出错

尝试释放以前的malloc时出错,c,C,我正在使用一个函数,从用户那里分配给定数量的字节,然后我有另一个函数,应该释放分配的内存。内存段用作包含x个大小相等的列表节点的池 初始功能: void create_mem(int mem_size, int num_n){ number_of_nodes = num_n; mem_block = malloc(mem_size); header = mem_block; } void delete_mem(){ free(mem_block); }

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

初始功能:

void create_mem(int mem_size, int num_n){
     number_of_nodes = num_n;
     mem_block = malloc(mem_size);
     header = mem_block;
}
void delete_mem(){
     free(mem_block);
}
头文件包含多个节点,头和mem块分别作为int、list和char

头文件中还有一个列表节点结构:

typedef struct list_node {
     list_node* next;
}list_node;
删除功能:

void create_mem(int mem_size, int num_n){
     number_of_nodes = num_n;
     mem_block = malloc(mem_size);
     header = mem_block;
}
void delete_mem(){
     free(mem_block);
}
该列表工作正常,我的代码包含insert_节点和delete_节点,它们工作正常,但每当main调用delete_mem函数时,我的程序就会崩溃

当我将delete_mem函数更改为:

void delete_mem(){
     mem_block = NULL;
     free(mem_block);
}
我没有得到任何错误,但我不认为这个删除函数实际上做了我希望它做的事情


我相信在释放内存之前,我需要删除原始mem_块中的所有内容,但我不确定如何执行该操作。

确保变量mem_块的值在malloc之后不会更改


如果更改,调用
free(mem_块)将出现故障

确保变量mem_块的值在malloc之后不会更改


如果更改,调用
free(mem_块)将遇到麻烦

您是反向操作的
NULL
首先调用变量意味着泄漏内存,然后
释放(NULL)
<代码>免费(空)
是合法的,但它是不可操作的;现在修复漏洞已经太晚了,因为你找不到指针了。使用:

void delete_mem(){
     free(mem_block);
     mem_block = NULL;
}
先释放
free
,然后退出
NULL


我不知道
mem_block
中可能有什么,但如果它包含指向其他已分配内存的指针,您需要对它“拥有”的任何指针进行深度优先遍历,
释放
外部“叶子”,然后再返回“四肢”,因此,在存储在内存中的所有指针都被
释放之前,您不会
释放内存。

您是反向操作的
NULL
首先调用变量意味着泄漏内存,然后
释放(NULL)
<代码>免费(空)
是合法的,但它是不可操作的;现在修复漏洞已经太晚了,因为你找不到指针了。使用:

void delete_mem(){
     free(mem_block);
     mem_block = NULL;
}
先释放
free
,然后退出
NULL


我不知道
mem_block
中可能有什么,但如果它包含指向其他已分配内存的指针,您需要对它“拥有”的任何指针进行深度优先遍历,
释放
外部“叶子”,然后再返回“四肢”,因此,在存储在内存中的所有指针也被释放之前,您不会释放内存。

没有足够的信息。显然,如果你分配
mem_block=NULL
,那么随后的
free()
就相当于
free(NULL)
,它什么也不做。最好的猜测是:你在(其他地方)给
mem_block
分配了一个新值,因此当你试图释放它时,它的值不再是从
malloc()收到的值
。下一个猜测:您多次尝试释放内存。信息不足。显然,如果你分配
mem_block=NULL
,那么随后的
free()
就相当于
free(NULL)
,它什么也不做。最好的猜测是:你在(其他地方)给
mem_block
分配了一个新值,因此当你试图释放它时,它的值不再是从
malloc()收到的值
。下一个猜测:您尝试多次释放内存。