1

相同地址、多个 shared_ptr 计数器相关,C++ 标准是否禁止?以及围绕多个指向同一个对象但不共享底层引用计数结构的 shared_ptr 对象的无数其他问题。

如果对象从上述问题中的“enable_shared_from_this”继承会发生什么?我的 shared_from_this() 返回什么?一个带有自定义删除器还是一个没有?

struct B : boost::enable_shared_from_this<B> {
  boost::weak_ptr < B > get_weak() {
    return shared_from_this();
  }
};

void doNothing(B *) {
}

int main() {
  B * b0 = new B;

  boost::shared_ptr < B > sddb0(b0, doNothing);
  boost::weak_ptr < B > swddb0(sddb0->get_weak());
  //  Does this have a custom deleter???
  boost::shared_ptr < B > sddb1 = swddb0.lock();

  boost::shared_ptr < B > scdb0(b0);
  boost::weak_ptr < B > swcdb0(sddb0->get_weak());
  //  Does this *not* have a custom deleter???
  boost::shared_ptr < B > scdb1 = swcdb0.lock();
}
4

1 回答 1

1

删除器与拥有的对象相关联,并将在最后一个所有者删除其引用时将其释放,因此共享同一对象所有权的所有指针也共享删除器。删除器不存储在单个shared_ptr对象中,它与引用计数一起存储在堆中,因此由共享相同计数的所有对象共享。

所以让我们看看你的代码。首先,我必须修复您的代码,因为它甚至没有按所示编译。测试问题中的代码总是一个好主意,以避免通过让他们修复错别字和添加缺少的标题来浪费人们的时间。

不要这样写:

B * b0 = new B;

boost::shared_ptr < B > sddb0(b0, doNothing);

正确的做法是:

boost::shared_ptr < B > sddb0(new B, doNothing);

基类enable_shared_from_this<B>有一个weak_ptr<B>由构造函数分配的成员shared_ptr,因此它weak_ptr与 共享所有权sddb0,由 . 返回的共享指针也是如此shared_from_this()

所以这个问题的答案是肯定的:

//  Does this have a custom deleter???
boost::shared_ptr < B > sddb1 = swddb0.lock();

sddb1共享所有权,sddb0因此具有相同的删除器。

您可以通过 usingget_deleter或通过写入stdoutindoNothing或通过 usingowner_less比较指针的所有者来测试它。

这将创建一个不现有共享指针共享所有权的对象:

boost::shared_ptr < B > scdb0(b0);

enable_shared_from_this<B>基地的成员weak_ptr<B>被上面的行重新分配,因此它与scdb0而不是共享所有权sddb0。因此,当您get_weak在该点之后调用时,它会返回一个共享所有权的弱指针,scdb0因此没有自定义删除器。同样,您可以通过查看doNothing未调用或使用owner_less.

于 2012-07-28T23:16:46.020 回答