2014-03-12 56 views
0

我很難用智能指針正確組織正確的東西。幾乎到了我不得不回到正常指針的地步。正確使用智能指針

我想在整個程序中輕鬆使用智能指針,而不必每次輸入shared_ptr<...>。我現在想到的一種解決方案是創建一個模板類併爲其添加一個typedef sptr,所以我可以執行class Derived : public Object <Derived> ..然後使用Derived::sptr = ...但是,這顯然非常可怕,因爲它不適用於另一個派生自Derived對象的類。

甚至做typedef shared_ptr<..> MyObjectPtr是可怕的,因爲那麼爲了一致性,或者至少對於unique_ptr和shared_ptr,需要爲每種智能指針完成。

那麼人們使用智能指針的標準方式是什麼?因爲坦率地說,我開始認爲使用它們太麻煩了。 :/

+5

你的問題是必須鍵入'shared_ptr '? – UmNyobe

+0

也許你應該從描述你實際想用智能指針來解決哪個問題開始?這個問題似乎是[X-Y問題]的一個例子(http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。 –

+0

內存泄漏==更大的麻煩 – user1095108

回答

2

那麼人們使用智能指針的標準方式是什麼?

很少。您發現使用它們很麻煩的事實表明您過度使用指針。嘗試重構您的代碼以指出例外,而不是規則。 shared_ptr尤其具有它的優勢,但它很小:即當您真的必須在多個對象之間共享資源的所有權時。這是一種罕見的情況。

因爲坦率地說,我開始認爲使用它們太麻煩了。 :/

同意。這是不使用指針的主要原因。

有更多的方法來避免指針。特別是,shared_ptr真的只需要拼寫出你實際需要的通過所有權。在不涉及所有權的函數中,您不會傳遞shared_ptr或原始指針;您將傳遞一個引用,並在調用該函數時取消引用該指針。

裏面功能你幾乎不需要明確類型;例如,你可以(也應該)簡單地說auto x = …;而不是shared_ptr<Class> x = …;來初始化變量。

綜述,你只需要在你的代碼中很少的地方拼出shared_ptr

0

我有很多動態創建對象的代碼。所以使用指針是必要的,因爲從一開始就不知道對象的數量。一個對象在一個子系統中創建,然後存儲在另一個子系統中,然後傳遞給創建子系統的進一步處理。所以我猜測意味着使用shared_ptr。好的設計?我不知道,但要求子系統創建它擁有的具體對象似乎是最合理的,並返回一個指向該對象接口的指針,然後將其傳遞給另一個與該對象交互的代碼段通過它的抽象界面。

我可以從工廠方法返回unique_ptr。但是如果我需要傳遞多次處理的對象,我會遇到麻煩。因爲在將其傳遞給另一個方法後,我仍然需要知道該對象,而unique_ptr意味着在執行move()後我會丟失該對象的軌跡。由於我需要至少有兩個對象的引用,這意味着使用shared_ptr。

我聽說最常用的智能指針是unique_ptr。當然不是在我的申請中。我最終會更頻繁地使用shared_ptr。這是否是設計不好的標誌?