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), 语句完结, 长期对象析构, 援用计数减一.

总结

下面的问题, 其实是没有把握智能指针的成员函数的确切语义, 当然, 起因可能很简单, 比方教材就说不明确, 或者顾名思义, 没认真看解释.

可能这也揭示咱们, 对于规范库文档要比拟相熟, 对拿不准的看下源码, 或者做些简略测试 而后再进行应用.