c++ - 发生了什么: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()
.
问题:
这里发生了什么?
解决方案
这里发生了什么?
在 MacOS 上,您似乎必须使用-std=c++11
(或更高标准)¹显式启用移动语义。否则,该示例碰巧可以编译(即,std::shared_ptr
可以使用相关库的实现)但由于未启用所需的语言功能而无法正常工作。这导致制作实际副本而不是移动构造。如果 AppleClang 包甚至不允许实例化std::shared_ptr
所需的语言功能何时未启用,那就更好了。
¹) 感谢@t.niese 测试给定的编译器/平台。
推荐阅读
- python - 循环使用日期和其他条件的行
- python-3.x - 更快的数据帧分组行列出
- python - 使用 PySpark Pipeline 在数字和分类上运行 StandardScaler 的顺序是什么?
- wpf - 切换到选项卡时如何避免错误文本显示
- c++ - 反向链表时析构函数中的内存错误
- python - 如何理解 Keras Conv2D 层权重的维度
- c# - 发送消息后 Azure 通知中心“无匹配目标”消息
- html - bootstrap 4 - 特别安排图像?
- sftp - org.apache.sshd.common.SshException: DefaultOpenFuture - 用于 SFTP 通信的 APACHE MINA
- ruby-on-rails - 将一个表连接到多个其他表且每个表都具有多对多关系的最佳实践是什么?