Boost :: shared_ptr使用它实例化

Jon*_*han 3 c++ multiple-instances this shared-ptr

考虑以下情况:

typedef boost::shared_ptr<B> BPtr;

class A
{
public:
    A() { b_ptr = BPtr(new B); }
    void a_func() { C::c_func(b_ptr); }
private:
    BPtr b_ptr;
}

class B
{
public:
    B() { b_ptr = BPtr(this); }
    void b_func() { C::c_func(b_ptr); }
private:
    BPtr b_ptr;
}

class C
{
public:
    static void c_func(BPtr b_ptr) { /*...*/ }
}
Run Code Online (Sandbox Code Playgroud)

可以用shared实例化shared_ptr this吗?
是否可以让两个shared_ptr对象指向同一个对象?(例如A :: b_ptr和B :: b_ptr)
如果这两个中的一个超出范围 - B的实例是否会被删除?

我猜我在做一些根本错误的事情.
我还考虑过将b_ptr的依赖注入用于B的构造函数,但这似乎也是非常错误的.

更新:
澄清 - A和B都需要使用C :: c_func.反过来,经过一些处理后,C需要在B中调用一个我没有在上面指定的回调函数.实际上有两个案例很有意思:

  1. 如果要求C不是有状态的 - 那么它需要从A和B中接收BPtr,如上面的代码所示.
  2. 如果C是有状态的,并且A和B都实例化单独的C实例,则在C的ctor中给出BPtr.

Jam*_*lis 10

可以用这个实例化shared_ptr吗?

不,至少有几个原因:

  1. 如果在堆栈上或静态地创建一个AB对象,最终会shared_ptr在堆栈上创建一个"拥有"对象; 当对象被销毁时,shared_ptr将调用析构函数,调用delete对象,并且只有Bad Things会发生.此外,即使对象是动态创建的,您也不确定您的类的所有者可以使用它做什么:他可以将它分配给某些其他类型的智能指针,例如auto_ptr,它具有完全不同的语义.

  2. 你最终得到一个循环引用.例如,b_ptr拥有它所属的B对象.你必须手动.reset()它才能B销毁对象.

你可以得到一个shared_ptrthis使用enable_shared_from_this,但也有很多需要注意的地方:即,你不能调用enable_shared_from_this一个构造函数.即便如此,您也不希望将shared_ptr对象存储在对象本身内部; 它没有任何意义.

我猜我在做一些根本错误的事情.

是的,但既然你没有说出你正在尝试做什么,那么很难说你应该做什么.您只告诉我们您是如何尝试这样做的,而不是您首先尝试做的事情.