心渐渐失空

导航

统计

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

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

 


复制代码

posted on   心渐渐失空  阅读(1026)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示