2013-03-18 48 views
2

我是新來的C++以及智能指針。 我有這樣的代碼。瞭解C++中的智能指針提升

Example* Example::get_instance() { 
     Example* example = new Example(); 
     return example; 
} 

我試圖將其轉換爲智能指針像這樣

shared_ptr<Example> Example::get_instance() { 
     shared_ptr<Example> example (new Example()); 
     return example; 
} 

這是因爲當我試圖從另一個類調用這個它不是working.I想實現的正確途徑一個單身物件。

+0

什麼是不工作? – 2013-03-18 05:38:01

+0

什麼不起作用?這絕對不是創建單身人士的方式。每次調用'get_instance'都會創建一個* singleton *的新實例。 – Praetorian 2013-03-18 05:38:14

+0

是的,我明白這一點。我問的是我可以返回這樣的共享指針嗎?shared_ptr 示例:: get_instance()或做它需要做這樣的例子*示例:: get_instance(){ – Kathick 2013-03-18 05:46:52

回答

1

您正在創建一個新的Example對象每次請求對象時,這是一個內存泄漏,在你每次也返回不同的對象。試試這個:

Example & Example::get_instance() { 
     static Example example; 
     return example; 
} 

同時請注意,您的代碼如下建議:

  • 創建智能指針時

    喜歡make_shared而不是shared_ptr<YourType>(new YourType(...))。之所以能找到here。相關摘錄:

    此功能通常分配內存於T對象和用於與單個存儲器分配 的shared_ptr的控制塊(它是在一個標準 非約束要求)。與此相反,申報 的std :: shared_ptr的P(新T(參數數量...))執行至少兩個存儲器 分配,這可能導致不必要的開銷。此外, F(shared_ptr的(新INT(42))中,g())可導致內存泄漏如果g 拋出異常。如果使用make_shared爲 ,則不存在此問題。

  • 瞭解std::unique_ptrstd::shared_ptr之間的差異。對於你的情況,std::unique_ptr會更好,但是對於你的問題有一個更簡單的解決方案,我已經在上面展示了。

  • 一般

    ,避免指針時,你可以使用引用相反,他們更容易使用和代碼看起來有點清潔。

  • 最後,你真的想要一個單身?我只是要問。我作爲一名程序員全職工作了將近4年。沒過多久,我知道,但足以遇到這樣的情況,我後悔我或其他人使用Singleton模式,而不是將該對象的引用傳遞給調用鏈。

儘量避免單身,你可以使用單可能會在到底想對你Example對象的多個實例,而不是調用示例:: get_instance工作,並且只能在單個實例工作後發現你的代碼。所以當你有這樣的啓示時,(這可能只是時間問題),你會在你面前進行重大的重構。

所以, 「當心,有怪物!」。

+1

或忘記布爾值和智能指針,在函數中創建對象的靜態實例並返回一個引用(或指針)。嘗試實現單例時,不需要涉及智能指針。 – Praetorian 2013-03-18 05:44:43

+0

true,true :))在OP代碼上工作,無法從樹中看到森林。 – 2013-03-18 05:48:00

+0

謝謝,編輯我的答案。我認爲參考文獻更好。 :D – 2013-03-18 05:49:25