2010-12-07 5 views
2

割り当てられたshared_ptr変数を返す関数を作成する必要があります。これは正しい方法ですか?関数にshared_ptrを割り当てます。

typedef boost::shared_ptr<std::vector<char> > sharePtr; 

void createPtr(sharePtr &p) 
{ 
    p = sharePtr(new std::vector<char>); 
} 

void test() 
{ 
    sharePtr p; 
    createPtr(p); 
} 

答えて

4

はい、正しいです。しかし、なぜちょうど書くべきではない:

sharedPtr createPtr() 
{ 
    return sharePtr(new std::vector<char>); 
} 

void test() 
{ 
    sharePtr p = createPtr(); 
} 

?これは、あなたのバージョンより速くても、コンパイラが移動セマンティクスをサポートしていれば、さらに高速になる可能性があります。

またmake_sharedの代わりに、直接new使用することをお勧めします:それは、参照カウンタのためのメモリ割り当てを避けることができるので、

sharedPtr createPtr() 
{ 
    return make_shared<std::vector<char>>(); 
} 

を。

+1

'make_shared'は、オブジェクトが大きい場合(' vector'はそうでない場合)、weakポインタ(このコードではありません)を使用している場合、 'make_shared'はそれが価値のあるものよりも多くのメモリを無駄にすることはありません。私はそれを言いたいと思った。 –

+0

@ Steve:同意します。 counter-counter-recommendation: 'make_shared'は例外安全です。このコードでは何が問題になりません。一般的な実装では、オブジェクトが大きいかどうかをチェックし、その場合は2つの割り当てを行いますか? – ybungalobill

+0

@ybungalobill:アイデアはありません。ほとんどのshared_ptrで制御されるオブジェクトは決して弱く参照されることは決してないので、make_sharedがそれを行うことは賢明ではないでしょうか。 –