深入学习c++--智能指针(一) shared_ptr
1. 几种智能指针
1. auto_ptr: c++11中推荐不使用他(放弃)
2. shared_ptr: 拥有共享对象所有权语义的智能指针
3. unique_ptr: 拥有独有对象所有权语义的智能指针
4. weaked_ptr: 到 std::shared_ptr 所管理对象的弱引用
1.1 shared_ptr
参考:https://zh.cppreference.com/w/cpp/memory/shared_ptr
std::shared_ptr
是通过指针保持对象共享所有权的智能指针。多个 shared_ptr
对象可占有同一对象。下列情况之一出现时销毁对象并解分配其内存:
#include <iostream>
#include <memory>
#include <thread>
#include <chrono>
#include <mutex> class Object
{
public:
Object(int id) : m_id(id) {
std::cout << "init obj " << m_id << std::endl;
}
~Object() {
std::cout << "bye bye " << m_id << std::endl;
}
int id() const {
return m_id;
}
private:
int m_id;
}; typedef std::shared_ptr<Object> ObjectPtr; void print(ObjectPtr obj);
void printRef(const ObjectPtr& obj); void interfaceOfSharedPtr()
{
ObjectPtr null;
std::cout << "ref count is " << null.use_count() << std::endl; // ObjectPtr obj(new Object());
std::cout << "ref count is " << obj.use_count() << std::endl; // ObjectPtr obj2(obj);
std::cout << "ref count is " << obj.use_count() << std::endl; // ObjectPtr obj3 = obj;
std::cout << "ref count is " << obj.use_count() << std::endl; // obj2.reset(); // 不需要了
//obj2 = nullptr; // c++11写法
std::cout << "ref count is " << obj.use_count() << std::endl; // ObjectPtr obj4;
obj3.swap(obj4);
//std::swap(obj3, obj4); // 本身管理资源,引用数没有变化
std::cout << "ref count is " << obj.use_count() << std::endl; // auto p = obj.get();
if (p)
{
std::cout << "id is " << p->id() << std::endl;
} if (obj)
{
std::cout << "p id is " << obj->id() << std::endl; // operator ->
std::cout << "ref id is " << (*obj).id() << std::endl; // operator *
} obj4 = nullptr;
// if (obj.unique()) //效率更高
// if (obj.use_count() == 1) // 会有效率损失 std::cout << "only one hold ptr " << obj.unique() << std::endl;
// 值传入
print(obj);
std::cout << "ref count is " << obj.use_count() << std::endl; // 引用传入, 推荐
printRef(obj);
} void print(ObjectPtr obj) // 值传入,会临时改变引用数量+1
{
std::cout << "count " << obj.use_count() << " id " << obj->id()
<< std::endl; //
} void printRef(const ObjectPtr& obj) // 引用传递不会改变引用数量
{
std::cout << "ref count " << obj.use_count() << " id " << obj->id()
<< std::endl; //
} void deleteOfObject(Object* obj)
{
if (obj) {
std::cout << "delete obj " << obj->id() << std::endl;
delete obj;
}
} void useDeleter()
{
// 管理 裸指针 和 处理这个指针的函数 -- 可以管理应用delete资源,也可以管理其他类似资源
ObjectPtr obj(new Object(), deleteOfObject);
ObjectPtr obj2 = obj;
} int main()
{ interfaceOfSharedPtr(); return ;
}
ref count is
init obj
ref count is
ref count is
ref count is
ref count is
ref count is
id is
p id is
ref id is
only one hold ptr
count id
ref count is
ref count id
bye bye
深入学习c++--智能指针(一) shared_ptr的更多相关文章
- 【STL学习】智能指针之shared_ptr
前面已经学习过auto_ptr,这里补充另外一种智能指针,比auto_ptr要更强力更通用的shared_ptr. shared_ptr 简介及使用选择 几乎所有的程序都需要某种形式的引用计数智能指 ...
- C++ | 再探智能指针(shared_ptr 与 weak_ptr)
上篇博客我们模拟实现了 auto_ptr 智能指针,可我们说 auto_ptr 是一种有缺陷的智能指针,并且在C++11中就已经被摈弃掉了.那么本章我们就来探索 boost库和C++11中的智能指针以 ...
- 智能指针之shared_ptr基本概述
1.shared_ptr允许有多个指针指向同一个对象,unique_ptr独占所指向的对象. 2.类似于vector,智能指针也是模板.创建智能指针: shared_ptr<string> ...
- 【C++11新特性】 C++11智能指针之shared_ptr
C++中的智能指针首先出现在“准”标准库boost中.随着使用的人越来越多,为了让开发人员更方便.更安全的使用动态内存,C++11也引入了智能指针来管理动态对象.在新标准中,主要提供了shared_p ...
- C++智能指针之shared_ptr与右值引用(详细)
1. 介绍 在 C++ 中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露.解决这个问题最有效的方法是使用智能指针(smart pointer).智能指针是存储指向动态分配(堆)对象指针 ...
- 深入学习c++--智能指针(二) weak_ptr(打破shared_ptr循环引用)
1. 几种智能指针 1. auto_ptr: c++11中推荐不使用他(放弃) 2. shared_ptr: 拥有共享对象所有权语义的智能指针 3. unique_ptr: 拥有独有对象所有权语义的智 ...
- [5] 智能指针boost::shared_ptr
[1]boost::shared_ptr简介 boost::shared_ptr属于boost库,定义在namespace boost中,包含头文件#include<boost/shared_p ...
- c++学习笔记——智能指针
智能指针是为了便于管理动态内存,能够自动管理释放所指向的对象. 智能指针共有三种:1.shared_ptr允许多个指针指向同一个对象:2.unique_ptr独占所指向的对象:3.weak_ptr是一 ...
- 关于智能指针boost::shared_ptr
boost库中的智能指针shared_ptr, 功能强大, 且开销小,故受到广大coder的欢迎. 但在实际的使用过程中,笔者也发现了一些不足. 1.定制的删除器 shared_ptr除了可以使用默认 ...
随机推荐
- Volley下载图片存放在data/data下 networkImageView lrucache
networkImageView 设置图片的方法 (有效) imageView.setImageUrl("https://www.baidu.com/img/bd_logo1.png&qu ...
- js 获取高度
网页可见区域宽 :document.body.clientWidth; 网页可见区域高:document.body.clientHeight; 网页可见区域高:document.body.offs ...
- laravel在控制器中赋值给视图
1.控制器 2.视图
- MongoDB复制集搭建(3.4.17版)
==版本== mongodb-linux-x86_64-rhel70-3.4.17.tgz ==准备== 3个节点,我这里的IP及hostname分别是: 10.11.2.52 dscn49 10.1 ...
- div 自适应宽度
div 自适应宽度 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...
- DB2分页查询SQL
select * from (select row_number() over() as rown,tpag.* from(SELECT int(COALESCE(列名1,0)),COALESCE(列 ...
- ORACLE 实用案列
ORACLE实用函数之一 ratio_to_report的简单使用 Oracle 输出树形结构 ORACLE 查看分区表分区大小 oracle 用一个表的一个字段更新另一个表的一个字段 oracle ...
- 判定一个数num是否为x的幂
那个数所在类型中,x的幂最大值为max 1.则第一条判定:max%num==0: 若x不为任何数的幂,则第一条判定足矣. 若x为某个数的幂,则要加判定条件 2.(num-1)%(x-1)==0 同时满 ...
- 2018.09.16 spoj104Highways (矩阵树定理)
传送门 第一次写矩阵树定理. 就是度数矩阵减去邻接矩阵之后得到的基尔霍夫矩阵的余子式的行列式值. 这个可以用高斯消元O(n3)" role="presentation" ...
- 2018.07.17 洛谷P1368 工艺(最小表示法)
传送门 好的一道最小表示法的裸板,感觉跑起来贼快(写博客时评测速度洛谷第二),这里简单讲讲最小表示法的实现. 首先我们将数组复制一遍接到原数组队尾,然后维护左右指针分别表示两个即将进行比较的字符串的头 ...