scoped指針的目標是什麼?據我瞭解,範圍指針管理一塊代碼中的內存。如果我想在一個塊內聲明一個變量,我可以在堆棧中聲明它,而不用擔心清理。爲什麼scoped指針在提升
回答
問題是你可以創建和清理某個詞法範圍內的指針。這可以在各種情況下有用,並且它可以確保您沒有內存泄漏,如果您明確使用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
如果是動態尺寸或類型,則不適用。另外,範圍指針可以交換,並且在C++中可以移動,所以它們不是嚴格限定範圍的。
除了「主要理由使用'scoped_ptr'而不是'auto_ptr'就是讓你的代碼的讀者知道你打算「資源獲取是初始化」僅僅適用於當前的範圍,並且沒有意圖轉移所有權「......看起來像'swap '不是一個預期的用法。 –
@BenVoigt:但它提供並可以使用。 – Puppy
這是[一箇舊線程](http://lists.boost.org/Archives/boost/2002/09/36359.php)討論爲什麼'swap'成爲一個需求(基本上這樣'scoped_ptr'可以用作成員可複製課程)。 –
通常線程堆棧有內存限制(請參閱線程堆棧大小)。
有時指針可能已從外部傳遞給您,並且需要在此範圍內刪除(例如,如果拋出異常,則該行下方的任何刪除調用都不會執行)。因此,你需要某種方式的自動神奇地清理指針
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();
}
與基於堆棧的數據,使用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?
- 1. 提升侵入指針
- 2. 爲什麼指向指針?
- 3. 爲什麼cudaMalloc()使用指針指針?
- 4. 爲什麼和什麼時候值得使用指針指針?
- 5. 爲什麼使用指針
- 6. 提升作用域指針提升線程
- 7. 爲什麼在這個編程中使用指針指針?
- 8. 爲什麼指針不在堆棧上?
- 9. 爲什麼在C中使用指針?
- 10. 什麼是指向指針的指針?
- 11. 用指針提升序列化
- 12. 指針運算和積分提升
- 13. 指針默認參數提升
- 14. 指針參數來提升python
- 15. 無法解釋爲什麼指針成爲創建的指針
- 16. 爲什麼有人需要一個指向指針的指針?
- 17. 爲什麼指向char的指針指針是最新的?
- 18. C - 爲什麼指針指針與指向數組的指針不同?
- 19. 什麼是強指針和弱指針
- 20. 指針指針的意義是什麼?
- 21. 指針指針是什麼意思?
- 22. 指針指針的語法是什麼?
- 23. 在Ruby中,「scoped」是什麼意思?
- 24. 爲什麼不提升::任何有「getter」?
- 25. 爲什麼工具欄沒有提升?
- 26. 爲什麼C#語言規範沒有提到指針類型?
- 27. 爲什麼後「免費」提領C指針給出值0
- 28. 爲什麼strcpy不使用dest指針的const指針?
- 29. 爲什麼我們要傳遞指針的指針cudaMalloc
- 30. 爲什麼NSError需要雙重間接? (指針指針)
http://www.boost.org/doc/libs/1_36_0/libs/smart_ptr/scoped_ptr.htm#Handle/Body –