如何将boost :: shared_ptr(或另一个智能指针)附加到对象父级的引用计数器?

时间:2010-05-03 00:56:38

标签: c++ boost smart-pointers shared-ptr

我记得之前遇到过这个概念,但现在却无法在谷歌找到它。

如果我有一个类型为A的对象,它直接嵌入一个B类型的对象:

class A {
    B b;
};

如何拥有指向B的智能指针,e。 G。 boost::shared_ptr<B>,但使用引用计数A?假设A本身的实例是堆分配的,我可以使用enable_shared_from_this安全地获取其共享计数。

2 个答案:

答案 0 :(得分:5)

D'哦!

shared_ptr文档中找到它。它叫做别名(见section III of shared_ptr improvements for C++0x)。

我只需要使用不同的构造函数(或相应的reset函数重载):

template<class Y> shared_ptr( shared_ptr<Y> const & r, T * p );

这样的工作方式(您需要首先将shared_ptr构造为父级):

#include <boost/shared_ptr.hpp>
#include <iostream>

struct A {
    A() : i_(13) {}
    int i_;
};

struct B {
    A a_;
    ~B() { std::cout << "B deleted" << std::endl; }
};

int
main() {
    boost::shared_ptr<A> a;

    {
        boost::shared_ptr<B> b(new B);
        a = boost::shared_ptr<A>(b, &b->a_);
        std::cout << "ref count = " << a.use_count() << std::endl;
    }
    std::cout << "ref count = " << a.use_count() << std::endl;
    std::cout << a->i_ << std::endl;
}

答案 1 :(得分:1)

我没有对此进行过测试,但只要孩子仍然需要,您就应该能够使用custom deallocator object将shared_ptr保留给父母。这些方面的东西:

template<typename Parent, typename Child>
class Guard {
private:
   boost::shared_ptr<Parent> *parent;
public:
   explicit Guard(const boost::shared_ptr<Parent> a_parent) {
      // Save one shared_ptr to parent (in this guard object and all it's copies)
      // This keeps the parent alive.
      parent = new boost::shared_ptr<Parent>(a_parent);
   }
   void operator()(Child *child) {
      // The smart pointer says to "delete" the child, so delete the shared_ptr
      // to parent. As far as we are concerned, the parent can die now.
      delete parent;
   }
};

// ...

boost::shared_ptr<A> par;
boost::shared_ptr<B> ch(&par->b, Guard<A, B>(par));