证明: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 ...
随机推荐
- verilog实现32位有符号流水乘法器
verilog实现32位有符号流水乘法器 1.4bit乘法流程 1.无符号X无符号二进制乘法器 以下为4bit乘法器流程(2X6) 0 0 0 0 0 0 1 0 (2) X 0 0 0 0 0 1 ...
- 新更新 Scanner键盘输入
原来我们都是将写好的代码进行打印,这是硬程序,如果我们想让电脑实时输入我们想要的值,就需要使用Scanner进行键盘录入 1.让电脑找到Scanner符咒(电脑自动) 2.召唤Scanner精灵 3. ...
- C#元数据的概念,以及一个使用了lambda表达式的简单例子
先看一个例子 假设你写了一个 C# 类库 MathUtils.dll: public class Calculator { public int Add(int a, int b) => a + ...
- 【Guava】BiMap&Multimap&Multiset
BiMap Map 可以实现 key -> value 的映射,如果想要 value -> key 的映射,就需要定义两个 Map,并且同步更新,很不优雅.Guava 提供了 BiMap ...
- 2024 (ICPC) Jiangxi Provincial Contest -- Official Contest
L. Campus 1.首先考虑时间复杂度,因为最多只会有2*k的时间点,所以我们采取的策略是,对这每个时刻,判断有多少扇门是开的,并且考虑这些门到其他点的最短路之和. 2.输入完数据以后,使用dij ...
- php-ffmpeg保存为.mp4格式时报错
原文: php-ffmpeg保存为.mp4格式时报错:FFMpeg\Exception\RuntimeException: Encoding failed in - 搜栈网 (seekstack.c ...
- 基于Blazor实现的运输信息管理系统
运输信息管理系统(TIMS)是一个集手机端和PC端协同工作的小型运输服务公司的信息化系统,采用Blazor框架的Auto模式进行开发. 1. 项目背景 目前司机运输任务完成后,在微信工作群中上报运输任 ...
- Python实验3 函数与代码复用
目的:理解函数封装与递归思想 实验任务: 基础 :编写函数cal_factorial(n)计算阶乘(循环实现). 源码: def cal_factorial(n): result = 1 for i ...
- EFCore——树形结构篇
1.整体数据量不大的场景 参照:EntityFramework Linq 查询数据获得树形结构-YES开发框架网 (yesdotnet.com) 核心方法GetChildData,特点将所有的数据查到 ...
- EFCore 实体追踪
理解: EFCore通过一种机制实时追踪实体的属性是否有改变的一种机制,比如下方代码 通过EFCore查出来的数据List集合里的实体,在item.Manager = "菲菲";属 ...