为什么gcc不能编译这个调用free()函数的简单代码?

时间:2011-09-16 11:27:41

标签: c++ gcc memory-management

我在codepad.org和ideone.com上尝试了以下代码:

char* ptr = new char;
free( ptr );

是的,我知道它是未定义的行为,但我想编译并运行它以查看会发生什么。

Visual C ++ 10编译它,但在上述网站上使用的gcc说

  

错误:在'('token

之前的预期构造函数,析构函数或类型转换

为什么这段代码不会用gcc编译,我怎么能让它编译?

6 个答案:

答案 0 :(得分:5)

以下是您的代码(来自your link):

#include <stdlib.h>

char* ptr = new char;
free( ptr );

free()是一个函数,在命名空间范围内,您无法编写函数调用语句。

在命名空间范围内,您只能声明定义变量和类型。但是,您可以在变量的初始化中调用函数。所以这没关系:

char* ptr = new char; //Note new is a function call!

但这不可行:

free(ptr); 

如果你想这样做,那么这就是一招:

const int ignore = (free(ptr), 0); //at namespace scope!

这没关系。演示:http://ideone.com/8yymM

答案 1 :(得分:4)

This code确实无法编译。您还必须添加main()来电。

#include <stdlib.h>

int main()
{
    char* ptr = new char;
    free( ptr );
    return 0;
}

答案 2 :(得分:2)

你只能在C中调用没有可见声明的函数。在C ++中,这是一个必须在编译时诊断出来的错误,它不是未定义的行为

要致电free,您必须包含stdlib.h标题。

答案 3 :(得分:2)

正确的代码应该是这个:

#include <stdlib.h>

int main()
{
   char* ptr = new char;
   free( ptr );
}

错误取决于全局范围内的free(ptr)不被视为函数调用,而是作为class free的对象的声明:-o。

顺便说一下,还要考虑ptr = new char的反面不是{​​{1}},而是free(ptr)。 (免费与delete ptr相反。malloc调用new,但执行更多。由于malloc调用delete但执行更多操作。

答案 4 :(得分:1)

您是否包含<stdlib.h>?可能是编译器无法识别free

答案 5 :(得分:0)

因为它是c ++,所以你需要使用g ++而不是gcc。