【发布时间】:2018-04-25 17:10:20
【问题描述】:
鉴于这个类是 enable_shared_from_this:
class connection : public std::enable_shared_from_this<connection>
{
//...
};
假设我从connection* 创建两个std::shared_ptr 实例,如下所示:
std::shared_ptr<connection> rc(new connection);
std::shared_ptr<connection> fc(rc.get(), [](connection const * c) {
std::cout << "fake delete" << std::endl;
});
到目前为止,它很好,因为资源 {connection*} 由 single shared_ptr — 准确地说是 rc 拥有,而 fc 只是有一个假删除器。
之后,我这样做:
auto sc = fc->shared_from_this();
//OR auto sc = rc->shared_from_this(); //does not make any difference!
现在shared_ptr — rc 或fc — 将与sc 共享它的reference-count?换句话说,
std::cout << rc->use_count() << std::endl;
std::cout << fc->use_count() << std::endl;
这些应该打印什么?我测试了这段代码,foundrc 似乎有2 引用,而fc 只是1。
我的问题是,为什么会这样? 正确的行为及其基本原理应该是什么?
我使用的是 C++11 和 GCC 4.7.3。
【问题讨论】:
-
fc对rc一无所知,因为它是用原始指针构造的,就好像它是一个新对象一样。 -
@jtbandes - 一般来说。从
enable_shared_from_this继承时,它可以知道更多。 -
有趣!感谢您提供规范的链接 :)
-
伪造的拥有智能指针(非拥有“拥有”智能指针)是非常有问题的。我可以看到它如何用于生命周期是永恒的对象(不限于带有 oa dtor 的静态对象),但总的来说,如果保留智能 ptr 的副本不延长生命周期对象“拥有”。
-
@curiousguy:嗯,“假”资源拥有智能ptr的想法在某些情况下可能很好。想象一个创建/销毁/管理对象的对象池,当客户端向它请求对象时,它通过将对象包装在
std::shared_ptr中来提供,这样当 shared_ptr 超出范围时,它持有的对象返回到池(即变为可用再次使用).... [继续]。
标签: c++ shared-ptr reference-counting weak-ptr enable-shared-from-this