2013-05-07 45 views
0

是否可以在不分配內存的情況下使用引用操作符( - >)調用函數。 我在某些情況下調用一個函數,而不用在C++中分配對象

Foo *fooObject; 
fooObject->someFunction; 

我對這個事情的困惑嘗試這種代碼。這在Dev C++中運行良好,但在visual C++中崩潰。

+1

這不是有效的代碼(未定義行爲實際上)它沒有意義,因爲fooObject(指向Foo)沒有被初始化,它可以指向任何地方,如果你不想在堆上分配內存,你可以在堆棧中進行:Foo fooObj; fooObj.someFunction() – maverik 2013-05-07 15:19:05

+0

「可能」是什麼意思?你可以編寫它(你的程序可以被編譯爲「格式良好」),但是maverik認爲它是未定義的行爲 – dyp 2013-05-07 15:32:29

回答

2

不,不可能使用 - >沒有分配內存,因爲這個操作符試圖取消引用一個指向對象的指針......因此該對象必須存在。

指向的對象必須存在...這是「內存分配」,這可以在堆棧或堆上完成。

以下語法...

fooObject->func(); 

相當於

(*fooObject).func() 

所以能夠做到*fooObject,目標指向fooObject必須存在。

在你的代碼

Foo *fooObject; 

是一個懸擺指針因爲你沒有在一個對象指向它。指針值可能爲NULL或指向一些完全隨機的內存塊:尊重它會導致你的問題,因爲不能保證你所引用的內容......這被稱爲「未定義的行爲」

分配內存爲你的對象,你可以做到這一點棧這樣

Foo fooObject; 

然後,您可以,如果你喜歡,使用指針的對象上...

Foo *fooObjectPTR = &fooObject; 

但請注意,分配給堆棧的對象只會在範圍內存在。當它超出範圍時,它會被銷燬,並且你的指針會再次成爲懸掛指針,所以不能使用它。

或者你也可以在堆中分配這樣

Foo *fooObjectPTR = new Foo(); 

如果您在堆上分配,你一定要小心,以釋放後使用delete

+0

我認爲這會是bett呃,說你不能使用 - >除非你的指針指向一個有效的對象。您可以將您的指針分配給基於堆棧的變量。 Foo * fooPTR; Foo foo_stk_obj; fooPTR =&foo_stk_obj; – Freddy 2013-05-07 15:29:02

+0

@Freddy ...是的,通過「分配記憶」來表達你的意思......我的意思是堆或堆棧,但你說得對,它可以更清晰......更新答案,謝謝 – Jimbo 2013-05-07 15:31:27

1

你可以調用靜態函數分配的內存類實際上不存在實例,但是這是通過使用::表示法來完成的,然後該函數在範圍外運行任何特定實例 - 類的靜態成員函數沒有隱式指針:

class Foo { 
public: 
    static void someFunction(void) {std::cout << "BOO!\n";}; 
}; 

... 
int main(...) { 
    Foo::someFunction(); 
    return 0; 
} 

中的標準狀態〔類靜態]:「A靜態構件可以 被稱爲使用類的成員訪問語法,在這種情況下,對象的表達 總是被判斷。「

與此相反,Microsoft documentation狀態:The left side of a member-selection operator (. or –>) that selects a static member function is not evaluated,這意味着以下適用於VC++,但不符合標準的C++:

Foo* not_allocated; 
not_allocated->someFunction(); 
+1

標準對此有何評論: 「一個後綴表達式,後跟一個點'.'或者一個箭頭' - >'[]然後後跟一個id表達式,是一個後綴表達式,在點或箭頭之前的後綴表達式被計算;」帶註腳「如果評估類成員訪問表達式,則即使結果不必確定整個後綴表達式的值,也會發生子表達式評估,例如,如果id表達式表示靜態成員**,則會進行子表達式評估。 [?expr.ref]/1 – dyp 2013-05-07 16:06:40

+0

也許更重要的是(?)是[class.static],其中指出「可以使用類成員訪問語法引用靜態成員,在這種情況下,總是對對象表達式進行評估」。我會更新我的答案。 – icabod 2013-05-07 16:28:03

相關問題