2012-05-24 68 views
8

scoped指針的目標是什麼?據我瞭解,範圍指針管理一塊代碼中的內存。如果我想在一個塊內聲明一個變量,我可以在堆棧中聲明它,而不用擔心清理。爲什麼scoped指針在提升

+0

http://www.boost.org/doc/libs/1_36_0/libs/smart_ptr/scoped_ptr.htm#Handle/Body –

回答

1

問題是你可以創建和清理某個詞法範圍內的指針。這可以在各種情況下有用,並且它可以確保您沒有內存泄漏,如果您明確使用new,則忘記delete,這不被推薦。

您應該記住,boost::scoped_ptr不可複製的,因此在整個生命週期中它完全擁有它的資源。這也使得它更安全,然後boost::shared_ptr,因爲它避免了複製資源或意外分享資源。

{ //Some Scope 

    boost::scoped_ptr<int> i_ptr; 
    // do something with pointer 

} // leave scope, pointer is cleaned up 
4

如果是動態尺寸或類型,則不適用。另外,範圍指針可以交換,並且在C++中可以移動,所以它們不是嚴格限定範圍的。

+1

除了「主要理由使用'scoped_ptr'而不是'auto_ptr'就是讓你的代碼的讀者知道你打算「資源獲取是初始化」僅僅適用於當前的範圍,並且沒有意圖轉移所有權「......看起來像'swap '不是一個預期的用法。 –

+0

@BenVoigt:但它提供並可以使用。 – Puppy

+2

這是[一箇舊線程](http://lists.boost.org/Archives/boost/2002/09/36359.php)討論爲什麼'swap'成爲一個需求(基本上這樣'scoped_ptr'可以用作成員可複製課程)。 –

0

通常線程堆棧有內存限制(請參閱線程堆棧大小)。

有時指針可能已從外部傳遞給您,並且需要在此範圍內刪除(例如,如果拋出異常,則該行下方的任何刪除調用都不會執行)。因此,你需要某種方式的自動神奇地清理指針

void foo(Object*obj) 
{ 
    //this will ensure that object gets cleaned up even if doFoo() throws an exception 
    boost::scoped_ptr<Object> objCleaner(obj); 
    obj->doFoo(); 
} 
+0

我可以在堆棧上聲明指針,當函數超出作用域時,它會自動清除,無論是成功還是異常。正確? – Jimm

+0

{X * x =&someObj; }這不會導致指針x在超出範圍時被刪除。 someObj在超出範圍時將被刪除。 {X * y = new X();}這種類型的代碼將需要scoped ptr來自動清理 – mohaps

2

與基於堆棧的數據,使用scoped_ptr有一個復位()成員 - 換句話說,你可以構建/毀滅你的心臟的內容。有了這個,你可以使用一個空指針(技術上爲operator unspecified-bool-type)作爲一個標誌,指示在任何給定時間是否有構造對象。如果需要,它還允許您獨立於變量範圍對構建/銷燬進行排序。

另外,考慮到你可以聲明一個scoped_ptr作爲一個類成員,而不僅僅是一個堆棧變量。 docs建議使用scoped_ptr來實現句柄/正文表達式(隱藏類的實現細節)。

最後,闡述DeadMG的觀點「不,如果它是動態類型的」,你可以使用scoped_ptr的實現polymorphic操作:

{ 
scoped_ptr<Base> a(mode ? new DerivedA : new DerivedB); 
a->polymorphic_function(); 
} 

這不是真的有可能與簡單重新建立了新來做到這一點基於分配。


而且在這裏看到:C++0x unique_ptr replaces scoped_ptr taking ownership?

+0

'boost :: variant '。 :) – GManNickG

+0

@GManNickG:我不認爲boost :: variant通過scoped_ptr爲多態提供了一個很好的替代 - 雖然有趣。謝謝! – nobar

+0

你爲什麼不這麼認爲? – GManNickG