• 证明: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时,计数才会增加,而在增加它的引用(&)时,计数不会增加。

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

    
    
  • 相关阅读:
    0919 作业
    0918 登录注册
    20190918 文件处理
    20190917 字符编码
    0916 作业
    0916 数据类型与深浅拷贝
    0913 作业
    0912 for循环及内置方法
    0911 作业
    Ubuntu同时忘记用户密码和root密码
  • 原文地址:https://www.cnblogs.com/xjjsk/p/12185882.html
Copyright © 2020-2023  润新知