• 证明: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
    "); delete p; });
            t = std::thread([&]() {Sleep(10000); printf("*p:%d
    ", *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
    "); delete p; });
            t = std::thread([=]() {Sleep(10000); printf("*p:%d
    ", *p); });
        }
        Sleep(20000);
        t.join();
        system("pause");
        return 0;
    }
    打印结果为:

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

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

    
    
  • 相关阅读:
    深度学习面试问题
    重新学习pytorch的库函数等..
    新电脑的操作系统win10的所有设置问题汇总
    二叉搜索树,和红黑树,
    Most common words
    Word histogram
    Random numbers
    Word frequency analysis
    DSU
    Sequences of sequences
  • 原文地址:https://www.cnblogs.com/xjjsk/p/12185882.html
Copyright © 2020-2023  润新知