我很好奇,因爲我開始採用更多的提升成語,看起來是最佳實踐我不知道我的C++在什麼時候甚至遠程看起來像過去的C++,經常在典型的例子和頭腦中找到那些沒有被引入「現代C++」的人?一旦你採用boost的智能指針,是否有任何情況下使用原始指針?
回答
短短几關我的頭頂:
- 在內存映射文件瀏覽各地。
- Windows API調用必須過度分配(如LPBITMAPINFOHEADER)。
- 任何代碼,你在任意內存(虛擬查詢()等)周圍。
- 只是你正在使用的一個指針的reinterpret_cast <>的任何時間。
- 任何時候您使用placement-new。
這裏的常見問題是「任何情況下,您需要將一段內存視爲除您擁有分配控制的資源之外的其他內容」。
這幾天我幾乎放棄了所有使用原始指針。我甚至開始通過我們的代碼庫來查看使用原始指針的地方,並將它們切換爲智能指針變體。通過這個簡單的行爲,我能夠刪除多少代碼是令人驚訝的。原生C++指針的生命週期管理浪費了太多的代碼。
我不使用指針的唯一地方是與其他代碼庫的幾個互操作場景,我沒有控制權。
我還是用在需要佔用空間小,如某些例外情況,在那裏我可以不承擔任何數據是有效的,也必須承擔,我運行內存過於資源敏感的代碼或其他代碼的常規指針。
託管內存幾乎總是優於原始數據,因爲這意味着您不必在正確的位置刪除它,但仍可以很好地控制指針的構造和銷燬點。
哦,還有一個其他地方使用的原始指針:
boost::shared_ptr<int> ptr(new int);
如果您有圓形的數據結構,例如,A點到B點和B點回到A,則不能使用簡單地使用A和B的智能指針,從那時起對象只會被釋放額外的工作。爲了釋放內存,您必須手動清除智能指針,這與刪除智能指針所消除的差不多。
你也許事情並不經常發生,但假設您具有智能指針一堆的子對象的父對象。在某個程序中,有人需要查找孩子的父母,因此他們將智能指針成員添加到孩子,並指向父母。無言以對,內存不再釋放。
需要注意一些事情。智能指針不等於垃圾收集。
這就是boost :: weak_ptr的用途,如果你有它的話。所以你仍然可以使用智能指針而不是原始的,只是不是所有的智能指針都是shared_ptr。 – 2008-12-12 18:13:12
絕對boost :: weak_ptr是解決循環引用問題的另一種方法,但我認爲我的觀點仍然存在:您必須注意,不要盲目使用任何智能指針。 – 2008-12-12 18:49:27
我幾乎根本不使用shared_ptr
,因爲我通常避免共享所有權。因此,我使用類似boost::scoped_ptr
的東西來「擁有」一個對象,但所有其他對它的引用都將是原始指針。例如:
boost::scoped_ptr<SomeType> my_object(new SomeType);
some_function(my_object.get());
但是some_function
將處理原始指針:
void some_function(SomeType* some_obj)
{
assert (some_obj);
some_obj->whatever();
}
我仍然使用原始指針上已存儲器映射的IO設備,諸如嵌入式系統,其中,具有智能指針沒有按」這真的很有意義,因爲你永遠不需要或能夠達到這個目的。
我發現'現代'C++和舊*東西之間的主要區別是小心使用類不變量和封裝。組織良好的代碼自然會有更少的指針飛來飛去。我幾乎像在新聞和刪除中一樣在shared_ptrs中游泳。
我很期待在C++ 0x中的unique_ptr
。我認爲這將清理仍然漫遊的少數(聰明)指針。
*仍然遺憾的是很常見的
當然,任何你正在處理遺留庫,否則你會需要通過原始指針API,雖然你可能只是從你的智能指針提取它暫時的時間。
事實上它始終是安全的原始指針傳遞給一個函數,只要功能不盡量保持指針的副本,全局或成員變量,或嘗試將其刪除。有了這些限制,函數不會影響對象的生命週期,並且智能指針的唯一原因是管理對象生存期。
我正在寫有C++共存目標C(使用Objective C++橋接)。 因爲作爲Objective C++類的一部分聲明的C++對象沒有調用的構造函數或析構函數,所以您不能在智能指針中使用它們。
所以我傾向於使用原始指針,雖然經常用的boost :: intrustive_ptr和內部的引用計數。
不,我會做,但你需要實現,比方說,一個鏈接列表或圖形原始指針。但是使用std::list<>
或boost::graph<>
會更聰明。
- 1. 用智能指針替換現有的原始指針
- 2. Boost智能指針
- 3. Boost智能指針和std智能指針有什麼區別?
- 4. 使用boost :: swap交換原始指針?
- 5. OpenCV或Boost智能指針
- 6. 如何在不使用指針的情況下模擬指針?
- 7. 在智能指針的bimap中查找原始指針
- 8. 從原始指針轉換爲智能指針
- 9. 集成智能指針遺留代碼原始指針
- 10. 從原始指針/參考創建智能指針
- 11. Boost中的作用域指針:什麼意思是一個原始指針?
- 12. std :: get_temporary_buffer返回的是原始指針而不是智能的指針
- 13. 什麼時候應該在智能指針上使用原始指針?
- 14. Java中是否有「智能指針」?
- 15. C++:識別原始指針使用情況的統計信息
- 16. C++和智能指針 - 智能指針如何在這種情況下提供幫助?
- 17. 指針和智能指針的區別
- 18. Boost python,將原始指針與託管指針進行比較?
- 19. Qt智能指針相當於Boost :: shared_ptr?
- 20. Boost智能指針和線程
- 21. 調用一個成員函數指針的智能指針
- 22. Boost-Python原始指針構造函數
- 23. 如何使用C++智能指針?
- 24. 智能指針代替指針
- 25. 虛空指針到智能指針
- 26. 將原始指針和智能指針的容器傳遞給模板函數
- 27. 使用指針:指針指針指針
- 28. C++智能指針
- 29. 與智能指針
- 30. 獲取智能指針的指針指針
我以爲有沒有開銷與boost:指針類?編譯器不會優化所有的東西嗎? – ApplePieIsGood 2008-12-12 18:53:49
有限範圍的指針類沒有大量開銷,但它必須存在,並且共享指針需要引用計數和關聯的機制。我總是遵循規則1;首先配置文件,然後優化。 – coppro 2008-12-12 19:17:36
無法想象我需要在堆上明確分配單個int的15年C++編碼的單個時間。 int:s的數組是另一回事,但總是有std :: vector。 –
2008-12-21 00:27:33