2012-03-09 47 views

回答

5

對象只與自動存儲時間析構函數時,這些對象離開其範圍被稱爲(不只是一個功能,但任何範圍:牙套,for -statements,甚至單行表達式)。

在另一方面,靜態存儲持續時間的對象僅破壞在程序退出,並且動態存儲持續時間的對象(即具有new操作者創建的那些)僅僅手動獲得銷燬請求。

當您按照您所描述的方式返回一個指針時,幾乎可以肯定該指針指向一個動態創建的對象,因此指針的接收者有責任確定該對象最終被清除。這是裸指針的一個很大的缺點:它們沒有傳達任何隱含的所有權聲明,並且必須在代碼之外手動提供關於誰負責動態對象的信息。

1

您創建的對象的析構函數使用new直到您delete指針纔會被調用。

爲確保您不會忘記刪除指針,請嘗試使用智能指針,例如std::shared_ptrstd::unique_ptr

如果您的編譯器不夠新以包含智能指針,您可以從Boost中找到一些。

1

當你返回對象的引用時,它不再限定在該函數中,因此不會隨函數而死(即指向該對象的指針不會被刪除)。

-1

C++(.net之外)在你告訴它之前不會刪除一個對象。

1

只有在您錯誤地編寫代碼時纔會發生這種情況。例如:

Foo* MyFunction() 
{ 
    Foo foo(2); 
    return &foo; 
} // foo is implicitly destroyed as we return 

這是壞了。我收到foo的地址,但它也因爲超出範圍而被破壞。這很好:

Foo* MyFunction() 
{ 
    Foo* j=new Foo(2); 
    return j; 
} // j is implicitly destroyed as we return 

這很好。雖然j由於超出範圍而被銷燬,但我返回的值仍然是我創建的Foo的地址。我分配的foo不會被銷燬,因爲它不會超出範圍。

+0

你可能想提到'static Foo foo(2 ); return &foo;'scenario。 – SigTerm 2012-03-09 23:54:16

+0

爲什麼Foo對象在第二個例子中沒有超出範圍? – 2012-03-09 23:58:52

+1

@badatmath:'Foo *'對象('j')超出了範圍(因爲它具有自動存儲持續時間),但'new Foo(2)'創建的'Foo'具有動態存儲持續時間(並且只有在你明確地銷燬它時纔會被銷燬(使用'delete'))。'new Foo (2)「從來不是真的在一個範圍內(它住在免費商店的以太網中),所以它不能超出範圍 – Mankarse 2012-03-10 00:24:27

1

有兩種分配對象的方式:堆棧和堆。

1)使用new關鍵字在堆上創建對象。這些物體直到delete d才被銷燬。

2)堆棧上存在其他物件 - 否new,否delete。這些對象在超出範圍時被銷燬。如果你返回一個指向其中一個對象的指針(通過獲取堆棧分配對象的地址,一旦對象已經超出範圍,指針將會失效)

相關問題