2

私は、以下のコードが正しいという新鮮な目を持ちたいと思っていました:

オブジェクト trifoo (ptr_vector に格納されている) に含まれるポインターは、共有ポインター 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;
}

注: 無意味なループは、メモリ リークをテストするためのもので、メモリ リークは発生しませんでした。

4

1 に答える 1

6

コードは技術的に正しいようです。

コピーのセマンティクスはshared_ptr、どのように実行されても、参照されるオブジェクトの参照カウントが増加することです。それはうまくいきます。心配することはありません。

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

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

  • 実際に可能な場合は、割り当ての代わりにコンストラクタ初期化子リストを使用してください。

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

乾杯&hth。、

于 2011-01-30T06:02:50.190 に答える