c++ - Boost::shared_ptr 使用这个实例化

标签 c++ this shared-ptr multiple-instances

考虑以下情况:

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 中的回调函数,我上面没有指定。 其实有两个案例很有意思:

  1. 如果要求 C 不是有状态的 - 那么它需要像上面的代码一样从 A 和 B 接收 BPtr。
  2. 如果 C 是有状态的并且 A 和 B 都实例化了单独的 C 实例,则在 C 的构造函数中提供一个 BPtr。

最佳答案

Is it ok to instantiate a shared_ptr with this?

不,至少有几个原因:

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

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

您可以使用 enable_shared_from_thisthis 获取 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/

相关文章:

concurrency - 用共享的数据库连接和缓存编写Rust微服务的惯用方式是什么?

c++ - 列出给定数字的质因数

c++ - 使用 boost::tuple of references 作为 ordered_unique 索引的键来增加多索引插入错误

javascript apply() 函数、jQuery 和 'this' 指针

javascript - 在 JavaScript 中调用函数时自定义

c++ - Qt & shared_pointer : execution error

c++ - allocate_shared 附加字节缓冲区

c++ - Sysgcc : ld. exe 找不到-lcurl -ljsoncpp

c++ - 为什么这会给出大小为 8 的未初始化值的使用

c# - 在基础构造函数中使用 'this'?