可以一次释放多个动态分配的内存吗?

时间:2018-03-07 12:53:41

标签: c memory-management free

在我的学校任务期间,我只是好奇,如果它真的像我期望的那样释放。

#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中运行,但我不确定它是否正确释放。

5 个答案:

答案 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()分配的空间。 如果ptrnull指针,则该函数不执行任何操作。

参考文献:

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)

在很少执行的日志记录代码中可能会让您崩溃。