2012-01-25 172 views
2

我有以下的僞代碼:C++參考指針

function1()//Gets called on startup 
{ 
    myclass* obj; 
    function2(obj); 
    obj->doSomething();//crashes here! 
} 

function2(myclass*& ret) 
{ 
    myclass* nobj = &myclass(); 
    nobj->doSomething();//Does not crash 
    ret = &nobj; 
} 

這樣看來,即使我設定RET爲指向的NObj,當我嘗試在OBJ操作(應指向的NObj,因爲ret是對obj的引用),我的程序崩潰了!顯然我做錯了什麼,任何人都知道它是什麼?

+1

凡'ret'聲明? –

+0

@ Mr.TAMER function2(myclass *&ret) –

+0

好像我需要睡得更多! –

回答

7

您正在通過執行&myclass()來獲取臨時地址,因爲該臨時表達式在表達式末尾被銷燬,並且編譯器不應該允許它。

雖然你的編譯器是在這方面已經不符合標準,你會在使用一個遭到破壞的對象,這是不確定的行爲,這就是爲什麼你的代碼崩潰。

此外,我不知道你是如何分配的指針指向一個myclass&nobj)的指針myclassret)。它不應該編譯。

+0

我們再見面!有趣。那麼我需要使用新的,並且當我完成它時,請確保將其釋放。 –

+0

@GeorgesOatesLarsen是的,或者更好的是使用帶智能指針的'new',所以你不必擔心清理它 –

+0

啊哈,再次感謝你:)我會在8分鐘內接受你。 –

2

嘗試:

myclass *obj = new myclass(); 
obj->doSomething(); 
delete obj; 
+1

儘管如此,使用智能指針。 – GManNickG