2011-09-16 52 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

相關問題