2013-09-25 288 views
0
class Foo{ 
    private: 
     int i; 
    public: 
     Foo(int a) 
     { 
      i = a; 
     } 

     int getI() {return i;} 
}; 

int main() 
{ 
    Foo* f; 
    if(true) 
    { 
     Foo g(1); 
     f = &g; 
    } 

    cout << f->getI() << endl; 
    return 0; 
} 

在上面的代碼中,Foo類的g對象一旦退出if子句就會超出範圍。所以當cout語句執行時,它會打印1嗎?指向對象的指針指向C++對象範圍之外

+3

惡魔飛出你的鼻子 - 或者,未定義的行爲。 –

回答

1

對象將被銷燬,調用對象的析構函數。

指針仍將指向相同的內存位置。

訪問它是一個未定義的行爲,所以它可以做任何事情。


你不能假設的這種行爲,但如果你的代碼只包含這個代碼,那麼有可能是一個很好的機會,這將有效地打印1作爲內存不會被自動覆蓋。

但不要認爲這將是這種情況!

4

行爲未定義。它可以做任何事情。你必須絕對避免未定義的行爲。

0

您收到Undefined behavior。你可以不知道什麼COUT將打印...

也許有時它會打印正確的值,但可以肯定的是,演示的日子也不會是正確的......

0

它可能。或者它可能不會。該對象將被銷燬,指針將指向內存中的同一個地址。

但取消引用這個指針是undefined behavior,這不是你想要的。事實上,一個沒有人會說它會做什麼的程序有什麼用?

3

這將導致未定義的行爲。在法律上,它可以做任何事情:它可以打印1,它可以打印42,它可以訂購比薩餅或可以結束宇宙中的所有生命。所有都是法律結果。未定義的行爲是很差不好。

一旦g超出範圍,就不再定義,f現在指向一個未定義的對象,而取消引用f雖然沒有被禁止,但不以任何定義的方式支持。

相關問題