首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >发生了什么: C++ std::std::shared_ptr增加use_count?

发生了什么: C++ std::std::shared_ptr增加use_count?
EN

Stack Overflow用户
提问于 2019-09-09 02:29:53
回答 1查看 1.6K关注 0票数 32

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

安装

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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)提供

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BEFORE x: { use_count=1; }
 AFTER x: { use_count=2; }
 AFTER y: { use_count=2; }

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

问题

怎么回事,这里?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-09 02:33:34

怎么回事,这里?

在MacOS上,您似乎必须使用-std=c++11 (或更高版本的标准)显式启用移动语义。否则,该示例碰巧会编译(即,来自相关库实现的std::shared_ptr是可用的),但由于没有启用所需的语言特性,它无法正常工作。这将导致实际复制,而不是移动构造。如果在不启用所需的语言特性时,AppleClang包甚至不允许实例化std::shared_ptr,情况会更好。

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

票数 43
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57852209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文