证明: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的引用不会增加它的计数值的更多相关文章
- std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题
在std::shared_ptr被引入之前,C++标准库中实现的用于管理资源的智能指针只有std::auto_ptr一个而已.std::auto_ptr的作用非常有限,因为它存在被管理资源的所有权转移 ...
- std::shared_ptr
在std::shared_ptr被引入之前,C++标准库中实现的用于管理资源的智能指针只有std::auto_ptr一个而已.std::auto_ptr的作用非常有限,因为它存在被管理资源的所有权转移 ...
- std::shared_ptr之deleter的巧妙应用
本文由作者邹启文授权网易云社区发布. std::shared_ptr 一次创建,多处共享,通过引用计数控制生命周期. 实例 在邮箱大师PC版中,我们在实现搜索时,大致思路是这样的: 每一个账号都有一个 ...
- std::shared_ptr<void>的工作原理
前戏 先抛出两个问题 如果delete一个指针,但是它真实的类型和指针类型不一样会发生什么? 是谁调用了析构函数? 下面这段代码会发生什么有趣的事情? // delete_diff_type.cpp ...
- Item 20: 使用std::weak_ptr替换会造成指针悬挂的类std::shared_ptr指针
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 矛盾的是,我们很容易就能创造出一个和std::shared_ptr ...
- C++11 std::shared_ptr总结与使用
最近看代码,智能指针用的比较多,自己平时用的少,周末自己总结总结.方便后续使用. std::shared_ptr大概总结有以下几点: (1) 智能指针主要的用途就是方便资源的管理,自动释放没有指针引用 ...
- 深入学习c++--智能指针(二) weak_ptr(打破shared_ptr循环引用)
1. 几种智能指针 1. auto_ptr: c++11中推荐不使用他(放弃) 2. shared_ptr: 拥有共享对象所有权语义的智能指针 3. unique_ptr: 拥有独有对象所有权语义的智 ...
- 智能指针思想实践(std::unique_ptr, std::shared_ptr)
1 smart pointer 思想 个人认为smart pointer实际上就是一个对原始指针类型的一个封装类,并对外提供了-> 和 * 两种操作,使得其能够表现出原始指针的操作行为. ...
- std::shared_ptr(二)
Defined in header <memory> template< class T > class shared_ptr; (since C++11) ...
- (译+原)std::shared_ptr及std::unique_ptr使用数组
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5462363.html 参考网址: http://stackoverflow.com/questions ...
随机推荐
- 【C#】Winform监听USB串口设备拔插实现自动断开
[C#]Winform监听USB串口设备拔插 零.问题 最近在开发串口相关的软件,需要检测串口拔掉后主动关闭串口,因此需要检测到USB的拔插事件. 一.解决 在主窗口From类下覆盖WndProc方法 ...
- C# using 别名
场景重现 当using的多个库出现类名重复的情况时... 解决办法 使用类的完全限定名称,例如: // 不需要using,避免using名称重复导致的异常 // 使用类的完全限定名称,俗称全名. Sy ...
- pg的计算百分数的问题
SELECT cast("dept_id" as varchar(32)) , cast("dept_name" as varchar(30)) AS &quo ...
- 基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程
本次演示部署环境:Windows 10专业版,转载请说明出处 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在 ...
- javaweb基础之HTTP、Request、Response、ServletContext
一.http协议是一个重要的协议,他是贯穿整合B/S架构的核心协议.因此学习http协议的时候一定要从请求和响应两个角度思考.注意方向性(请求:浏览器->服务器:响应:服务器->浏览器) ...
- 想靠RAG提升模型回答质量,那是不可能的
提供AI咨询+AI项目陪跑服务,有需要回复1 上周写了一篇AI知识库的文章:聊聊与一体机同等级的智商税:AI知识库 事实上,文章对于AI知识库是稍带了点否定的色彩,因为单独的知识库毫无意义,但企业本身 ...
- react项目vite报错:UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token '??='
问题: vite报错:UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token '??=' 今天clone一个vite的项目,安装 ...
- CF1546B题解
看了题面,一道简单的假交互题 题目传送门,另一个传送门 读好题目很重要 AquaMoon 有 nnn 个长度为 mmm 的字符串,其中 nnn 是奇数. 然后她选取 n−1n-1n−1 个字符串,将它 ...
- MongoDB学习(二)
MongoDB基本操作 查看数据库 语法: show databases 选择数据库 语法:use 数据库名 注意:在MongoDB中选择不存在的数据库不会报错,后期当该数据库有数据时,系统会自动创建 ...
- 当数据爆炸遇上SQL Server:优化策略全链路解析
在数据驱动的时代,海量数据冲击下的数据库性能成为系统成败的关键.SQL Server作为企业级数据库的常青树,面对单表亿级数据量时,我们往往陷入分库分表与否的抉择困境. 我们站在SQL Server视 ...
