我在codepad.org和ideone.com上尝试了以下代码:
char* ptr = new char;
free( ptr );
是的,我知道它是未定义的行为,但我想编译并运行它以查看会发生什么。
Visual C ++ 10编译它,但在上述网站上使用的gcc说
错误:在'('token
之前的预期构造函数,析构函数或类型转换
为什么这段代码不会用gcc编译,我怎么能让它编译?
答案 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。