gpt4 book ai didi

c++ - 发生了什么事:C++ std::move on std::shared_ptr 增加了 use_count?

转载 作者:行者123 更新时间:2023-12-02 10:08:07 31 4
gpt4 key购买 nike

我一直假设 std::shared_ptr 上的 std::move() 窃取指针并将原始指针设置为 nullptr - 因此不会增加引用计数。在我的世界里这似乎不是真的。

设置:

MacOS,g++ -version =>“Apple LLVM 版本 10.0.1 (clang-1001.0.46.3)”

代码:

#include <cstdio>                                                                                                                                                                                  
#include <memory>
class Thing { public: Thing(int N) : value(N) {} int value; };

void print(const char* name, std::shared_ptr<Thing>& sp)
{ printf("%s: { use_count=%i; }\n", name, (int)sp.use_count()); }

int main(int argc, char** argv) {
std::shared_ptr<Thing> x(new Thing(4711));
print("BEFORE x", x);
std::shared_ptr<Thing> y = std::move(x);
y->value = 4712;
print(" AFTER x", x);
print(" AFTER y", y);
return 0;
}

输出:

编译(g++ tmp.cpp -o test)并运行(./test),交付

BEFORE x: { use_count=1; }
AFTER x: { use_count=2; }
AFTER y: { use_count=2; }

因此,使用 std::move() 时引用计数会增加。

问题:

这里发生了什么?

最佳答案

What is going on, here?

在 MacOS 上,您似乎必须使用 -std=c++11 (或更高版本的标准)显式启用 move-sematics。否则,该示例会编译(即相关库实现中的 std::shared_ptr 可用),但由于未启用所需的语言功能而无法正常工作。这会导致生成实际的拷贝而不是移动结构。如果在未启用所需的语言功能时 AppleClang 包甚至不允许 std::shared_ptr 的实例化,那就更好了。

1) 感谢@t.niese 测试给定的编译器/平台。

关于c++ - 发生了什么事:C++ std::move on std::shared_ptr 增加了 use_count?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57852209/

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