gpt4 book ai didi

c++ - 如何测试 shared_ptr 是空的还是什么都不拥有

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:23:16 26 4
gpt4 key购买 nike

C++ std::shared_ptr<..>可能是,也可能是null。这两个概念都存在,而且它们是等价的。此外,这些情况之间的任何一种暗示都不总是正确的。

后一种情况检测起来很简单,因为 operator bool恰好提供了那个测试。根据文档,它“检查 *this 是否存储了一个非空指针,即是否 get() != nullptr 。”

是否有针对前一种情况的测试,即事物为的情况?

我对此的使用非常简单。我有一个具有静态工厂方法的类。静态工厂方法里面是一个静态本地shared_ptr到类的一个实例,初始化为 nullptr .对该工厂方法的第一次调用构造该类的实例并初始化静态本地 shared_ptr在返回它的拷贝之前 - 这是由 mutex 保护的.那shared_ptr可以被任何东西保存、复制和传递,可以通过对静态工厂的额外调用来获取更多拷贝,最后,当所有拷贝都被销毁时,shared_ptr的删除器破坏实例。

实例本身是用遗留的 C API 创建和销毁的,由我的类包装,而且,尽管这些实例旨在作为单例共享,但它们也需要在不再需要时清理 - 与单例不同.

目前,我正在使用空检查来确定静态本地 shared_ptr 是否存在。应该被初始化或仅仅被复制。我担心此测试无法检测需要重新初始化的情况 - 例如,如果在所有先前用户放弃其引用且共享实例已删除后的某个时间某些东西试图获取实例。

或者 shared_ptr 是真的吗?重置为 nullptr当引用计数降为零并调用删除器时?也适用于自定义删除器?

也相关:What is the difference between an empty and a null std::shared_ptr in C++?

最佳答案

shared_ptr 的静态实例将保存一个引用,因此该对象将始终具有一个 >= 1 的引用计数,并且在静态清理发生之前不会被删除。正如 cnettel 在评论中所说,你需要 std::weak_ptr 这里。

weak_ptr 基本上是一个 shared_ptr,它不会影响引用计数。它通过 .lock() 方法对 std::shared_ptr 进行原子转换。如果未初始化,生成的 std::shared_ptr 将转换为 false,因此您知道要重新初始化(或第一次初始化)。

例子:

std::shared_ptr<Obj> instance() {
static std::weak_ptr<Obj> instance;
static std::mutex lock;

std::lock_guard<std::mutex> guard(lock);

auto result = instance.lock();
if (!result) {
result = std::make_shared<Obj>();
instance = result;
}

return result;
}

关于c++ - 如何测试 shared_ptr 是空的还是什么都不拥有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42108853/

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