1

Boost の smart_ptr 機能と、 and との間の変換機能が気に入っていshared_ptrますweak_ptrが、参照カウントは指定されたクラス自体に含まれていないため、次のコードは機能しません (また、機能しないはずです)。

A *a = new A;
shared_ptr<A> aPtr1(a);

{
    shared_ptr<A> aPtr2(a);

    // The reference counts of aPtr1 and aPtr2 are both 1.
}   // At this point, `a` is destructed by aPtr2.

aPtr1->foo();   // And... SIGTERM

JUCEフレームワークにはこの機能があると思います。[ReferenceCountedObjectおよびReferenceCountedObjectPtr] ただし、自分のアプリケーションには Boost を使用したいと考えています。boost::detail::shared_countBoost smart_ptrs がプライベートインスタンスではなく、指定されたクラスで参照カウントを検索できるようにすることは可能ですか?

4

3 に答える 3

2

簡単な解決策:

A *a = new A;
shared_ptr<A> aPtr1(a);
{
    // construct new shared pointer from old one.
    shared_ptr<A> aPtr2(aPtr1);
}
aPtr1->foo();

より複雑なものが必要な場合は、http: //www.boost.org/libs/smart_ptr/enable_shared_from_this.htmlを参照してください。

ヘッダー<boost/enable_shared_from_this.hpp>はクラステンプレートを定義しenable_shared_from_thisます。shared_ptrこれは、メンバー関数内から現在のオブジェクトを取得できるようにする基本クラスとして使用されます。


編集:enable_shared_from_this私はそれが派生に関していくつかの不幸な問題を抱えていると言及すべきでした。ただし、以下はc++11で機能します。ブーストで試したわけではありませんが、そこでも機能するはずです。ちょっとしたハックだと思います。shared_ptrを使用するときにrawポインターを使用すると、涙が出てしまいます。

struct X : std::enable_shared_from_this {
  /* stuff */
};

struct Y : X {
  /* stuff */
  void yonly() {};
};

int main() {
  Y* y = new Y;
  shared_ptr<Y> sy(y);
  sy->yonly();
  {
    auto sy2 = std::shared_ptr<Y>(y->shared_from_this(), y);
    sy2->yonly();
  } 
  std::cout << "Block ended" << std::endl;
  return 0;
} 
于 2012-11-11T20:11:01.467 に答える
2

boost::intrusive_ptrはおそらく要件に適合します。

ただし、shared_ptr を使用する場合は、次のように作成する必要があります。

shared_ptr<A> aPtr1 = boost::make_shared<A>();
于 2012-11-11T20:08:33.363 に答える
0

これは例外セーフではありません:

// call this as in shared_ptr<T> foo = create_intrusive_shared( new T(blah) );
// This takes ownership of the pointer you pass it.
template<typename T>
std::shared_ptr<T> create_intrusive_shared( T* t )
{
  auto retval = std::shared_ptr<T>( t, []( T* cleanup )
  {
    if (cleanup)
      cleanup->RemoveRef();
  });
  return retval;
}

// Call this if you have an existing instance of T, whose ownership is being
// maintained elsewhere.  Do not call it with new T() as an argument, unless
// new instances of T are created with a 0 ref count
template<typename T>
std::shared_ptr<T> make_intrusive_shared( T* t )
{
  if (t)
    t->AddRef();
  auto retval = create_intrusive_shared(t);
  return retval;
}

例外を安全にするには、もう少し作業が必要です。を再実装する必要がありますが、結果にクリーンアップ関数でmake_sharedタグを付けます。shared_ptr

于 2012-11-11T20:41:16.517 に答える