2008-12-12 64 views

回答

6

短短几關我的頭頂:

  • 在內存映射文件瀏覽各地。
  • Windows API調用必須過度分配(如LPBITMAPINFOHEADER)。
  • 任何代碼,你在任意內存(虛擬查詢()等)周圍。
  • 只是你正在使用的一個指針的reinterpret_cast <>的任何時間。
  • 任何時候您使用placement-new。

這裏的常見問題是「任何情況下,您需要將一段內存視爲除您擁有分配控制的資源之外的其他內容」。

4

這幾天我幾乎放棄了所有使用原始指針。我甚至開始通過我們的代碼庫來查看使用原始指針的地方,並將它們切換爲智能指針變體。通過這個簡單的行爲,我能夠刪除多少代碼是令人驚訝的。原生C++指針的生命週期管理浪費了太多的代碼。

我不使用指針的唯一地方是與其他代碼庫的幾個互操作場景,我沒有控制權。

2

我還是用在需要佔用空間小,如某些例外情況,在那裏我可以不承擔任何數據是有效的,也必須承擔,我運行內存過於資源敏感的代碼或其他代碼的常規指針。

託管內存幾乎總是優於原始數據,因爲這意味着您不必在正確的位置刪除它,但仍可以很好地控制指針的構造和銷燬點。

哦,還有一個其他地方使用的原始指針:

boost::shared_ptr<int> ptr(new int); 
+0

我以爲有沒有開銷與boost:指針類?編譯器不會優化所有的東西嗎? – ApplePieIsGood 2008-12-12 18:53:49

+0

有限範圍的指針類沒有大量開銷,但它必須存在,並且共享指針需要引用計數和關聯的機制。我總是遵循規則1;首先配置文件,然後優化。 – coppro 2008-12-12 19:17:36

+0

無法想象我需要在堆上明確分配單個int的15年C++編碼的單個時間。 int:s的數組是另一回事,但總是有std :: vector 。 – 2008-12-21 00:27:33

1

如果您有圓形的數據結構,例如,A點到B點和B點回到A,則不能使用簡單地使用A和B的智能指針,從那時起對象只會被釋放額外的工作。爲了釋放內存,您必須手動清除智能指針,這與刪除智能指針所消除的差不多。

你也許事情並不經常發生,但假設您具有智能指針一堆的子對象的父對象。在某個程序中,有人需要查找孩子的父母,因此他們將智能指針成員添加到孩子,並指向父母。無言以對,內存不再釋放。

需要注意一些事情。智能指針不等於垃圾收集。

+1

這就是boost :: weak_ptr的用途,如果你有它的話。所以你仍然可以使用智能指針而不是原始的,只是不是所有的智能指針都是shared_ptr。 – 2008-12-12 18:13:12

+0

絕對boost :: weak_ptr是解決循環引用問題的另一種方法,但我認爲我的觀點仍然存在:您必須注意,不要盲目使用任何智能指針。 – 2008-12-12 18:49:27

7

我幾乎根本不使用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(); 
} 
2

我仍然使用原始指針上已存儲器映射的IO設備,諸如嵌入式系統,其中,具有智能指針沒有按」這真的很有意義,因爲你永遠不需要或能夠達到這個目的。

4

我發現'現代'C++和舊*東西之間的主要區別是小心使用類不變量和封裝。組織良好的代碼自然會有更少的指針飛來飛去。我幾乎像在新聞和刪除中一樣在shared_ptrs中游泳。

我很期待在C++ 0x中的unique_ptr。我認爲這將清理仍然漫遊的少數(聰明)指針。

*仍然遺憾的是很常見的

4

當然,任何你正在處理遺留庫,否則你會需要通過原始指針API,雖然你可能只是從你的智能指針提取它暫時的時間。

事實上它始終是安全的原始指針傳遞給一個函數,只要功能不盡量保持指針的副本,全局或成員變量,或嘗試將其刪除。有了這些限制,函數不會影響對象的生命週期,並且智能指針的唯一原因是管理對象生存期。

1

我正在寫有C++共存目標C(使用Objective C++橋接)。 因爲作爲Objective C++類的一部分聲明的C++對象沒有調用的構造函數或析構函數,所以您不能在智能指針中使用它們。

所以我傾向於使用原始指針,雖然經常用的boost :: intrustive_ptr和內部的引用計數。

0

不,我會做,但你需要實現,比方說,一個鏈接列表或圖形原始指針。但是使用std::list<>boost::graph<>會更聰明。