首页 > 解决方案 > 发生了什么:C++ std::move on std::shared_ptr 增加了 use_count?

问题描述

我一直假设std::move()在 a 上std::shared_ptr窃取指针并将原始指针设置为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().

问题

这里发生了什么?

标签: c++macosshared-ptrrvalue-reference

解决方案


这里发生了什么?

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

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


推荐阅读