2013-04-02 67 views
-2

參考範圍結束時,參考指向指針對象(堆中的對象)時會發生什麼?我的意思是在堆中的對象是摧毀或它仍然是:當引用作用域結束時,引用指向指針對象(堆中的對象)時會發生什麼?

e.g:

void f(){ 
    Object &obj= *new Object() ; 

    int &i = new int; 
} 

void main(){ 
    f(); 
} 

對象是在破壞F的結束,或者必須調用「刪除& N」在結束了嗎?原始值相同嗎? 如果它必須銷燬,那麼我如何創建一個常量原始值的副本並將其賦值爲引用而不用「新」?

(對不起,語法或正寫法,並從原來的問題打字錯誤)

+2

您似乎將您的引用與您的指針混合在一起。 –

+2

你的代碼示例不會編譯。 – user763305

回答

1
Object &n = new Object(); 

這不會編譯。 A 新表達式new Object()返回一個指向動態分配對象的指針。您無法使用Object*初始化Object&

如果您有T&類型的參考,您應該使用T類型的對象進行初始化。這就是參考的工作原理。 T&是對T對象的引用。

可以做到這一點:

Object &n = *new Object(); 

這將間接引用由新的表達(與*)返回的指針,讓你它指向,然後Object初始化與參考Object。不過,我不建議這樣做。它只是隱藏了對象被動態分配的事實。

而且,這樣做並不影響動態分配對象的生命週期。如果使用新表達式創建一個對象,它具有動態存儲持續時間,因此您必須在某個時刻使用delete

0

首先,你需要決定。你想這樣的:

Object &n = * new Object(); 

或者你想這樣的:

Object* &n = new Object(); 

無論如何,當引用走出去的範圍,他們不會導致要刪除的對象。 在你的例子中,你將有內存泄漏,沒有辦法恢復分配在堆中的Objectint

0

首先:你的代碼不會編譯。

在你最應該(只是編譯...)這樣做:

Object &n = *(new Object());,但我不推薦這種做法。

關於第二個問題:總是你寫「新」,總是你必須在一段時間內刪除。

相關問題