码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-01-13 11:01:26      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:技术   http   code   图片   导致   src   计数   值传递   thread   

#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的引用不会增加它的计数值

标签:技术   http   code   图片   导致   src   计数   值传递   thread   

原文地址:https://www.cnblogs.com/xjjsk/p/12185882.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!