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