2015-05-17 44 views
-4

我有類A和B共享指針返回和對象壽命

class A{}; 

class B { 
    private: 
     shared_ptr<A> spa; 
    public: 
     B() { 
     //init spa 
     } 
    //... 
}; 

我應該做的:

shared_ptr<B> func() { 
    //.... 
    return shared_ptr<B>(new B); 
} 

或最好做:

B* func(){return new B;} 
shared_ptr<B> caller=shared_ptr<B>(func()); 

另外,更合理地返回一個對像shared_ptr的引用:

shared_ptr<B>& func() { 
    //.... 
    return shared_ptr<B>(new B); 
} 

或指向一個shared_ptr

shared_ptr<B>* func() { 
    //.... 
    return &shared_ptr<B>(new B); 
} 
+0

這最後的代碼片斷將無法正常工作,你就返回一個指針到一個臨時的。另外,有一個指向共享指針的指針很少有意義。並且不要通過引用返回,該代碼片段返回對臨時值的引用。而是通過值*返回*。智能指針的一個要點是你應該能夠把它們看作*值*,並且它們有適當的操作符和構造函數來處理它們。 –

+0

你的一半代碼甚至不是有效的。請多加註意這個問題。 –

回答

0

前兩個選項多的編程風格的問題。我發現第一個更清晰,更容易閱讀。

另外兩個例子顯然是錯誤的。這是行不通的,因爲你返回一個臨時指針或一個臨時指針。兩者都會打破你的計劃。

0

我會轉移所有權與make_shared:

std::shared_ptr<Y> func() 
{ 
    return std::make_shared<B>(); 
}