在我的学校任务期间,我只是好奇,如果它真的像我期望的那样释放。
#include "stdio.h"
#include "stdlib.h"
void main(){
int* menu1 = (int*)malloc(sizeof(int));
int* menu2 = (int*)malloc(sizeof(int));
int* menu3 = (int*)malloc(sizeof(int));
int* menu4 = (int*)malloc(sizeof(int));
int* menu5 = (int*)malloc(sizeof(int));
free(menu1,menu2,menu3,menu4,menu5);
system("pause");
}
它仍然在VS2017中运行,但我不确定它是否正确释放。
答案 0 :(得分:2)
对于您拥有的每个指针,您分别分配了内存。通过内存分配,系统分配更多的请求,以便安全一些控制信息,这些控制信息应该用于不同的内部目的,以及稍后用于解除分配。
由于每个分配的内存只知道自身而不知道其他已分配的内存,因此无法将所有内存释放。
free函数只需要一个参数(一个指针)。请参阅C标准中的7.22.3.3。
GCC没有编译此代码。
答案 1 :(得分:2)
没有
https://linux.die.net/man/3/free
void free(void *ptr);
我的代码无法编译:
error: too many arguments to function ‘free’
free(menu1,menu2,menu3,menu4,menu5);
答案 2 :(得分:2)
您的代码无法编译,因为函数free()
需要一个参数,但您传递的不止于此;确切地说5
。
您可以通过将参数括在括号中来进行编译:
free((menu1, menu2, menu3, menu4, menu5));
这允许使用comma operator评估所有参数,但只有最后一个参数将由函数free()
使用。也就是说,只有menu5
将被释放,其余的将被取消。
您必须分别对每个参数调用free()
以正确释放内存:
free(menu1);
free(menu2);
...
free(menu5);
答案 3 :(得分:2)
代码不会编译:
free(menu1,menu2,menu3,menu4,menu5); /* error: too many arguments to function 'free' */
函数free
在标题<stdlib.h>
中定义,只接受一个参数:
void free( void* ptr );
参数:
`ptr` - pointer to the memory to deallocate
返回值:
(none)
函数释放先前由malloc()
,calloc()
,aligned_alloc
,(自C11
)或realloc()
分配的空间。
如果ptr
是null
指针,则该函数不执行任何操作。
参考文献:
C11 standard (ISO/IEC 9899:2011):
7.22.3.3 The free function (p: 348)
C99 standard (ISO/IEC 9899:1999):
7.20.3.2 The free function (p: 313)
C89/C90 standard (ISO/IEC 9899:1990):
4.10.3.2 The free function
答案 4 :(得分:0)
如果这个编译你正在使用olde编译器。您所展示的是C代码中的常见错误。
在这种情况下,生成的代码看起来像这样:
PUSH menu5 ; which probably looks more like "menu5(SP)"
PUSH menu4
PUSH menu3
PUSH menu2
PUSH menu1
CALL _free
free()只需要一个参数并找到一个参数:menu1。额外的参数只会被忽略。
什么会导致更大的问题是不能将足够的参数传递给函数。在这种情况下,被调用的函数将使用堆栈上的随机垃圾作为参数。像
这样的东西 fprintf (fp)
在很少执行的日志记录代码中可能会让您崩溃。