【发布时间】:2018-02-11 05:43:51
【问题描述】:
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
}
【问题讨论】:
标签: c++ c++11 language-lawyer