2011-01-30 4 views
2

ブースト::私は以下のコードは、その中で正しいことを目の新鮮なペアを持っていると思ったshared_ptrのセマンティクス(コピー)

(ptr_vectorに格納されている)オブジェクトtrifooに含まれるポインタが共有されているがポインタf、g、h。

また、trifooのコンストラクタでのshared_ptrのコピーの結果は何ですか。 shared_ptrを共有する正しい方法です。参照カウントが増えていることを確認しています。他のすべての疑問を検証するためにテストできましたが、これを(正しく)確認する方法がわかりません。どんな批判も歓迎です。

#include <boost/ptr_container/ptr_vector.hpp> 
#include <boost/shared_ptr.hpp> 

class foo { 
    int a, b; 
public: 
    foo(int A, int B) : a(A), b(B) {} 
}; 

typedef boost::shared_ptr<foo> foo_ptr; 

class trifoo { 
    foo_ptr c, d, e; 
public: 
    trifoo(const foo_ptr& C, const foo_ptr& D, const foo_ptr& E) : c(C), d(D), e(E) {} 
}; 

int main() { 
    for (int i = 0; i < 5000000; i++) { 
     foo_ptr f(new foo(1,2)); 
     foo_ptr g(new foo(2,3)); 
     foo_ptr h(new foo(4,5)); 

     boost::ptr_vector<trifoo> tris; 

     tris.push_back(new trifoo(f, g, h)); 
    } 

    return 0; 
} 

注:無意味なループはメモリリークをテストすることでしたが、何も起こりませんでした。

+1

私には正常に見えます。ただし、初期化リストを代入する方が好都合で、 'tris'ベクトルは1つの要素しか持たないでしょう。 – GManNickG

+0

これは単純にptr_vectorの機能をテストするだけでしたが、この実装は実用的なアプリケーションではありません。答えのため – dcousens

答えて

6

コードは、技術的に正しいと思われます。

shared_ptrのコピーのセマンティクスは、しかし、それが実行され、呼ば-にオブジェクトの参照カウントを増加することです。それだけで動作します。何も心配する必要はありません。

いくつかのスタイルの問題は、しかし:

  • は、参照することによりshared_ptrを渡す、またはそれをconstを宣言し、無意味です。それはいつもコピーすることができるからです。値段でshared_ptrの値を渡すだけです。

  • 使用コンストラクタの初期化子リストの代わりに、実用的に可能な割り当て。別の表現で3 new年代を持つ

  • は非常に良いです。例外安全性の落とし穴を回避します。しかし、さらに良いことに、作成ロジックをファクトリ関数に入れます。

乾杯& HTH。、

+0

おかげで、工場出荷時の機能に関しては、まさにそれ(約)などの機能を持つことを意味するであろう、この概念について学びた: foo_ptr fooという:: makeFooPtrは(int型、int型bを){リターンfoo_ptr (新しいfoo(a、b)); } または少なくともこれらの行に沿ってください。 – dcousens

+0

参照してコピーを保存しないでください(コピーが作成されている場合)?私はそれらを価値のあるものにし、C++ 03でそれらをメンバーに交換します。 – GManNickG

+0

これは私の最大の疑念でした。私はshared_ptrがどのように解析するのか分からず、実際にコピーされたものに関するセマンティクスは私には不明でした。私は参照カウンタが一貫性を保つために想像することができます、それはコピーに関係なく同じポインタを指している必要がありますか?また、スワップをどのように実装してもよいでしょうか。 – dcousens

関連する問題