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中调用一个我没有在上面指定的回调函数.实际上有两个案例很有意思:
Jam*_*lis 10
可以用这个实例化shared_ptr吗?
不,至少有几个原因:
如果在堆栈上或静态地创建一个A或B对象,最终会shared_ptr在堆栈上创建一个"拥有"对象; 当对象被销毁时,shared_ptr将调用析构函数,调用delete对象,并且只有Bad Things会发生.此外,即使对象是动态创建的,您也不确定您的类的所有者可以使用它做什么:他可以将它分配给某些其他类型的智能指针,例如auto_ptr,它具有完全不同的语义.
你最终得到一个循环引用.例如,b_ptr拥有它所属的B对象.你必须手动.reset()它才能B销毁对象.
你可以得到一个shared_ptr从this使用enable_shared_from_this,但也有很多需要注意的地方:即,你不能调用enable_shared_from_this一个构造函数.即便如此,您也不希望将shared_ptr对象存储在对象本身内部; 它没有任何意义.
我猜我在做一些根本错误的事情.
是的,但既然你没有说出你正在尝试做什么,那么很难说你应该做什么.您只告诉我们您是如何尝试这样做的,而不是您首先尝试做的事情.
| 归档时间: |
|
| 查看次数: |
729 次 |
| 最近记录: |