使用C ++共享指针的别名构造函数和一个空的共享指针

std :: shared_ptr有一个别名构造函数,允许新创建的shared_ptr在指向其他对象时与现有的共享指针共享状态。

我正在考虑滥用这个构造函数把指针放在shared_ptr里面的一些全局对象中:

int global = 0;

int main() 
{
    // because we point to global object we do not need to track its lifetime
    // so we use empty shared_ptr<void> as a provider of shared state
    std::shared_ptr<int> p(std::shared_ptr<void>(), &global);
    std::shared_ptr<int> pp = p; 
    return *pp;
}

我的问题是:合法吗? 该代码在主要编译器上成功运行。

请注意,我不问这是否是件好事。 我明白,有一种使用无操作删除器将全局对象指针指向shared_ptr的规范方法。 如果它是合法的,它也有点令人不安,因为它可能具有可解引用的shared_ptr,它总是过期的弱指针:

    std::shared_ptr<int> p(std::shared_ptr<void>(), &global);
    std::weak_ptr<int> w = p;
    if (p) // p is alive and well 
    {      // and w is not
        *w.lock(); // and here program crashes
    }

正如你已经知道的那样,用你当前的解决方案, puse_count()为零,这就是weak_ptr过期的原因。 根据C ++草案N4296,这似乎没有问题:

20.8.2.2.1 shared_ptr构造函数 [util.smartptr.shared.const]
模板shared_ptr(const shared_ptr&r,T * p)noexcept;
13作用:构造一个存储p并与r共享所有权的shared_ptr实例。
14后置条件:get()== p && use_count()== r.use_count()
[注意:为避免悬挂指针的可能性,此构造函数的用户必须确保p至少在r的所有权组被破坏之前保持有效。 - 结束注释]
[注意:这个构造函数允许创建一个空的shared_ptr实例,并且存储一个非空的指针。 - 结束注释]

20.8.2.2.2 shared_ptr析构函数[util.smartptr.shared.dest]
〜shared_ptr的();
1效果:
(1.1) - 如果*为空或与另一个shared_ptr实例(use_count()> 1)共享所有权, 则不会产生副作用。
(1.2) - 否则,如果*拥有一个对象p和一个删除器d,则调用d(p)。
(1.3) - 否则,*拥有一个指针p,并且调用delete p

强调我的。
你可以使用下面的代码来给出一个use_count()为1的shared_ptr

std::shared_ptr<int> p(&global, [](int*){});

这使用空的自定义删除器。

链接地址: http://www.djcxy.com/p/40461.html

上一篇: Using C++ shared pointer's aliasing constructor with an empty shared pointer

下一篇: Chinese URL loads correctly in Edge but not other browsers