考虑以下情况:
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) { /*...*/ }
}
可以用this
实例化一个shared_ptr吗?
可以让两个 shared_ptr 对象指向同一个对象吗? (例如 A::b_ptr 和 B::b_ptr)
如果这两者之一超出范围 - B 的实例是否会被删除?
我猜我在做一些根本性的错误。
我还考虑过将 b_ptr 的依赖注入(inject)用于 B 的构造函数,但这似乎也是错误的。
更新:
澄清一下——A 和 B 都需要使用 C::c_func。反过来,经过一些处理后,C 需要调用 B 中的回调函数,我上面没有指定。
其实有两个案例很有意思:
- 如果要求 C 不是有状态的 - 那么它需要像上面的代码一样从 A 和 B 接收 BPtr。
- 如果 C 是有状态的并且 A 和 B 都实例化了单独的 C 实例,则在 C 的构造函数中提供一个 BPtr。
最佳答案
Is it ok to instantiate a shared_ptr with this?
不,至少有几个原因:
如果您在堆栈上或静态地创建一个
A
或B
对象,您最终会得到一个shared_ptr
“拥有”在堆栈上创建的对象;当对象被销毁时,将调用shared_ptr
析构函数,对对象调用delete
,只有坏事会发生。此外,即使该对象是动态创建的,您也不确定您的类的所有者可能会用它做什么:他可能会将它分配给一些其他类型的智能指针,如auto_ptr
,它具有完全不同的语义。您最终得到一个循环引用。例如,
b_ptr
拥有它所属的B
对象。您必须手动.reset()
它才能销毁B
对象。
您可以使用 enable_shared_from_this
从 this
获取 shared_ptr
,但有很多注意事项:即,您不能调用 >enable_shared_from_this
在构造函数中。即便如此,您也不想将 shared_ptr
存储到对象本身内部的对象;这没有任何意义。
I'm guessing I'm doing something fundamentally wrong.
是的,但是由于您还没有明确说明您正在尝试做什么,所以很难说您应该做什么。您只告诉我们您将如何尝试执行此操作,而没有告诉我们您首先要尝试做什么。
关于c++ - Boost::shared_ptr 使用这个实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4765214/