我总是假设std::move()
在std::shared_ptr
上窃取指针,并将原始指针设置为nullptr
-thus,而不增加引用计数。在我的世界里,这似乎不是真的。
安装:
MacOS,g++ -version => "Apple 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()
时,引用计数会增加。
问题
怎么回事,这里?
发布于 2019-09-09 02:33:34
怎么回事,这里?
在MacOS上,您似乎必须使用-std=c++11
(或更高版本的标准)显式启用移动语义。否则,该示例碰巧会编译(即,来自相关库实现的std::shared_ptr
是可用的),但由于没有启用所需的语言特性,它无法正常工作。这将导致实际复制,而不是移动构造。如果在不启用所需的语言特性时,AppleClang包甚至不允许实例化std::shared_ptr
,情况会更好。
(1)感谢@t.niese测试给定的编译器/平台。
https://stackoverflow.com/questions/57852209
复制相似问题