2011-09-16 48 views
0

我试图在两个codepad.org和ideone.com下面的代码:为什么gcc不会编译这个调用free()函数的简单代码?

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

是的,我知道这是不确定的行为,但我想编译并运行它,看看会发生什么。

的Visual C++编译10,但是这是对上述网站用gcc说

error: expected constructor, destructor, or type conversion before ‘(’ token

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

+1

您应该发布链接以及。毕竟,他们都在线! – Nawaz

+0

@Nawaz:添加链接到ideone.com – sharptooth

+0

真是太遗憾了。我忘了将该代码放入'main()'中。 – sharptooth

回答

4

This code确实不会编译。您还必须添加main()电话。

#include <stdlib.h> 

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

为了编译,不需要从main()调用'free()'。 'free()'也可以从命名空间作用域调用。这是诀窍,为此请参阅我的解决方案。 – Nawaz

+0

是的,但我不认为OP会应用这个技巧,他忘了写'main()' – ks1322

0

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

+0

我无法控制 - 我只在这些网站上有一个“语言”开关。我选择语言和站点选择编译器可执行文件。我不相信他们做错了 - 他们将无法使用。 – sharptooth

+0

是啊,对不起 - 我错过了你说你使用在线编译器的地方。我只是想:“啊!我自己以前犯了这个愚蠢的错误!”哈。 – dantswain

2

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

要拨打free,您必须包含stdlib.h标题。

+0

我确实是这样做了http://ideone.com/ser2G - 它没有帮助。 – sharptooth

+0

我假设你的发布代码在函数体中?我想不出任何会导致编译错误的东西。我的gcc版本给出了“error:'free'未在此范围内声明”,这是一个更有用的错误消息。 –

1

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

2

正确的代码应该是这样:

#include <stdlib.h> 

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

误差取决于一个事实,即免费(PTR)在全球范围内并没有被视为一个函数调用,但作为一个声明对象class free:-o。

顺便说一句,还要考虑到ptr = new char的反义词不是free(ptr),而是delete ptr。 (免费是malloc的反义词new调用malloc,但做得更多一些,因为delete调用free,但做了更多的事情)。

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

相关问题