C++ shared_ptr智能指针reset()使用示例详解
C++ shared_ptr智能指针 reset() 详解
最近看了个问题:智能指针引用计数为什么不是0?, 问将智能指针reset后为何不是引用减一.
代码说明
#include <cstdio> #include <memory> auto main() -> int { std::shared_ptr<int> ptr = std::make_shared<int>(100); auto second = ptr; auto third = ptr; printf("num = %d, count = %ld\n", *ptr, ptr.use_count()); ptr.reset(); printf("ptr count = %ld\n", ptr.use_count()); printf("second and third count = %ld\n", second.use_count()); return 0; }
ptr调用reset后, 引用数为0, 而不是2.
reset()函数的语义
通过源码可能比较好理解:
void reset() _NOEXCEPT { shared_ptr().swap(*this); }
这是reset()的实现, 用shared_ptr()调用构造一个临时指针, 并将其与调用reset()的指针对象(上例中的ptr)进行交换, 原对象指向的资源变为nullptr, 引用计数变为0.
临时对象指向原指针指向的资源(上例中的100), 引用计数变为3(临时对象, second, third), 语句结束, 临时对象析构, 引用计数减一.
总结
上面的问题, 其实是没有掌握智能指针的成员函数的确切语义, 当然, 原因可能很复杂, 比如教材就说不明白, 或者望文生义, 没仔细看解释.
可能这也提醒我们, 对于标准库文档要比较熟悉, 对拿不准的看下源码, 或者做些简单测试 然后再进行使用.
以上就是C++ shared_ptr智能指针reset()使用示例详解的详细内容,更多关于C++ shared_ptr智能指针reset的资料请关注脚本之家其它相关文章!
最新评论