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), 语句完结, 长期对象析构, 援用计数减一.
总结
下面的问题, 其实是没有把握智能指针的成员函数的确切语义, 当然, 起因可能很简单, 比方教材就说不明确, 或者顾名思义, 没认真看解释.
可能这也揭示咱们, 对于规范库文档要比拟相熟, 对拿不准的看下源码, 或者做些简略测试 而后再进行应用.