gpt4 book ai didi

c++ - 将 C++ 共享指针的别名构造函数与空共享指针一起使用

转载 作者:可可西里 更新时间:2023-11-01 18:38:17 24 4
gpt4 key购买 nike

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 constructors [util.smartptr.shared.const]
template shared_ptr(const shared_ptr& r, T* p) noexcept;
13 Effects: Constructs a shared_ptr instance that stores p and shares ownership with r.
14 Postconditions: get() == p && use_count() == r.use_count()
15 [ Note: To avoid the possibility of a dangling pointer, the user of this constructor must ensure that p remains valid at least until the ownership group of r is destroyed. — end note ]
16 [ Note: This constructor allows creation of an empty shared_ptr instance with a non-null stored pointer. — end note ]

20.8.2.2.2 shared_ptr destructor [util.smartptr.shared.dest]
~shared_ptr();
1 Effects:
(1.1) — If *this is empty or shares ownership with another shared_ptr instance (use_count() > 1), there are no side effects.
(1.2) — Otherwise, if *this owns an object p and a deleter d, d(p) is called.
(1.3) — Otherwise, *this owns a pointer p, and delete p is called

强调我的。
您可以改用以下代码,它给出一个 use_count() 为 1 的 shared_ptr:

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

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

关于c++ - 将 C++ 共享指针的别名构造函数与空共享指针一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46012436/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com