使用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
}
正如你已经知道的那样,用你当前的解决方案, p
的use_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