关于c++:C-sharedptr智能指针-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), 语句完结, 长期对象析构, 援用计数减一.

总结

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

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理