大多数人不知道 C++ std::shared_ptr的引用不会增加它的计数值

Posted 心渐渐失空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大多数人不知道 C++ std::shared_ptr的引用不会增加它的计数值相关的知识,希望对你有一定的参考价值。

#include <thread>
#include <memory>
#include <Windows.h>
int main()
{
    std::thread t;
    {
        std::shared_ptr<int> p(new int(1), [](int* p) { printf("delete\\n"); delete p; });
        t = std::thread([&]() {Sleep(10000); printf("*p:%d\\n", *p); });
    }
    Sleep(20000);
    t.join();
    system("pause");
    return 0;
}

上面使用引用传参,打印结果为:

 

 证明了智能指针的引用不会增加智能指针的引用计数。下面换成 将智能指针用值传递,也就是发生拷贝:

#include <thread>
#include <memory>
#include <Windows.h>
int main()
{
    std::thread t;
    {
        std::shared_ptr<int> p(new int(1), [](int* p) { printf("delete\\n"); delete p; });
        t = std::thread([=]() {Sleep(10000); printf("*p:%d\\n", *p); });
    }
    Sleep(20000);
    t.join();
    system("pause");
    return 0;
}
打印结果为:

 

只有在std::shared_ptr发生copy时,计数才会增加,而在增加它的引用(&)时,计数不会增加。

新手容易混淆的点,这里搞错很容易在传参时引用已经销毁了的资源,导致程序崩溃哦。

 


以上是关于大多数人不知道 C++ std::shared_ptr的引用不会增加它的计数值的主要内容,如果未能解决你的问题,请参考以下文章

关于高性能负载均衡架构,这些知识点大多数人不知道!

关于高性能负载均衡架构,这些知识点大多数人不知道

高性能负载均衡架构如何 实现,这些知识点大多数人不知道!

很多人不知道可以使用这种 key 的方式来对 Vue 组件时行重新渲染

普通人不知道的XP秘密

百分之九十的人不知道?在Python中f-string的几个技巧