gpt4 book ai didi

C++ shared_ptr use_count for nullptr

转载 作者:可可西里 更新时间:2023-11-01 15:51:48 26 4
gpt4 key购买 nike

我定义并分配了 2 个 shared_ptr nullptr。在情况 1 中,我使用默认构造函数,在情况 2 中,我使用带有 delete 方法的构造函数。

shared_ptr<int> sptr2(nullptr);

cout << "sptr2 use_count: " << sptr2.use_count() << endl;

shared_ptr<int> sptr6(nullptr, default_delete<int>());

cout << "sptr6 use_count: " << sptr6.use_count() << endl;

输出是:

sptr2 use_count: 0
sptr6 use_count: 1

我不明白为什么 sptr6 在没有任何有效指针的情况下使用计数为 1。

g++(海湾合作委员会)4.8.5 20150623(红帽 4.8.5-16)

最佳答案

根据 C++11 和 C++14 中的 [util.smartptr.shared.const](我没有检查 C++17),shared_ptr 如果您不传递任何参数,则为“空”。否则,即使 pnullptr_tshared_ptr“拥有 p”。

当提供一个删除器时,这是有道理的(毕竟你必须将删除器存储在某个地方),但是我不能说这对于单参数构造函数的目的是什么。

显然我并不孤单,因为实际函数的 C++11/C++14 规范 ([util.smartptr.shared]/1) 列出了 constexpr shared_ptr (nullptr_t) : shared_ptr() { },这表明这种构造(但不是提供删除器的构造)应该导致“空”shared_ptr!

但这与列出的语义直接矛盾(它特别给出了 use_count == 1 作为两个示例的后置条件),因此看起来是标准。

GCC 显然选择支持函数规范(cppreference.com 也是如此)。在这种情况下,至少您的删除器应该是空操作。

真正使用默认构造函数,这样写:

shared_ptr<int> sptr;

关于C++ shared_ptr use_count for nullptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48885252/

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