智能指针与STL查漏补缺

前言


c++文章连载:
1.C++基础
  1.C++基础
  2.C++新增和有变化的关键字
  3.C++的内存管理
2.面向对象
  1.C++的封装和访问权限
  2.C++继承和多态特性
  3.C++的运算符重载
  4.C++静态类和静态成员
  5.C++的友元函数和友元类
3.模板编程和STL
  1.C++模板编程入门
  2.STL的容器类和迭代器
  3.STL的泛型算法
  4.模板特化与类型萃取
  5.STL的其他容器讲解
  6.智能指针与STL查漏补缺
4.杂项
  1.c++各种流操作
  2.依赖,关联,聚合,组合,继承
  3.一些技巧性的代码设计
  
  


1.智能指针的本质原理

1.1、为什么需要智能指针
(1)智能指针是为了解决内存泄漏问题
(2)内存泄漏问题,本质上是因为程序员自己忘记主动释放导致的
(3)智能指针的解决思路是:连带自动释放
1.2、智能指针的本质工作原理
(1)一方面,利用局部变量/对象分配在栈上,代码段结束时会自动释放的特性
(2)另一方面,利用对象释放时会自动调用析构函数的特性
1.3、智能指针演示代码实战
(1)定义一个类TestPtr,写出构造函数和析构函数
(2)main.cpp中写一个全局函数func,在main中调用执行func
(3)func中定义一个TestPtr类的对象作为局部变量,测试验证程序执行后自动调用析构函数
(4)在TestPtr中定义成员变量int *p, 构造中new申请空间给p,析构中delete释放
(5)在TestPtr中写test_use函数,使用p所指向的内存
(6)分析以上,TestPtr使用了动态内存但是并不会导致内存泄漏,这就是智能指针的套路
1.4、总结
(1)智能指针本身是一个类,而普通指针本身是一个变量
(2)智能指针的“智能”指的是随着智能指针对象本身的释放,所指向的对象也释放
(3)C++里面的四个智能指针: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其中后三个是C++11支持,并且第一个已经被C++11弃用

2.auto_ptr的使用

2.1、auto_ptr的常规使用
2.2、auto_ptr的成员方法
(1)成员函数
(2)观察器:get operator* operator->
(3)修改器: reset release

3.auto_ptr的弊端

参考:https://blog.csdn.net/czc1997/article/details/84026887

4_5_6.unique_ptr的使用之构造函数123

结合cppreference的unique_ptr构造函数页面sample学习

7.unique_ptr的其他成员详解

7.1、修改器
(1)release
(2)reset
(3)swap
7.2、观察器
(1)get
(2)get_deleter
(3)operator bool
7.3、元素访问
(1)单对象版本,*和->
(2)数组对象版本,[]
7.4、非成员函数
(1)make_unique

8.unique_ptr的对比和总结

8.1、unique_ptr比auto_ptr的优势
(1)消费unique_ptr的函数能以值或以右值引用接收它

unique_ptr<People> pass_through(unique_ptr<People> p)
	{
		p->bar();
		return p;
	}

(2)unique_ptr在智能指针变量赋值方面比auto_ptr安全

unique_ptr pu1(new string (“hello world”));
unique_ptr pu2;
pu2 = pu1; // 不允许

unique_ptr pu3;
pu3 = unique_ptr(new string (“You”)); // 允许

8.2、unique_ptr的不足和使用注意事项

(1)不要与裸指针混用

int *x(new int());
unique_ptr up1,up2;
up1.reset(x);
up2.reset(x); //会使up1 up2指向同一个普通对象

(2)不能忘记接收u.release()的返回值
8.3、unique_ptr总结
(1)unique_ptr 之所以叫这个名字,是因为它只能指向一个对象,当它指向新的对象时,之前所指向的对象会被释放。
(2)当unique_ptr本身被释放时,指向的对象也会被自动释放
(3)unique_ptr实现独占式拥有或严格拥有概念,保证同一时间内只有一个智能指针可以指向该对象。
(4)要安全的重用unique_ptr,可以用reset给他赋新值。
(4)std::move()能够将一个unique_ptr赋给另一个。这样转移所有权后 还是有可能出现原有指针调用就崩溃的情况。但是这个语法能强调你是在转移所有权,让你清晰的知道自己在做什么,从而不乱调用原有指针。

9.CPP11最常用的智能指针shared_ptr

9.1、shared_ptr的设计思路
(1)auto_ptr和unique_ptr是独占式智能指针,即任何时候智能指针和对象是1对1绑定的,不能2对1
(2)shared_ptr是基于引用计数式的设计,因此可以多个智能指针绑定1个对象,这会带来很多方便
(3)shared_ptr在基础的定义和使用方式上,与前2个很类似,所以很容易学会使用
9.2、shared_ptr的基本使用
(1)智能指针的创建,一般有2种方式:使用构造函数、使用std::make_shared方法
(2)代码实战:shared_ptr与单个对象的绑定和使用,测试智能指针的多种常见用途

10.shared_ptr的引用计数详解

10.1、引用计数的获取和检测
(1)use_count
(2)unique
(3)operator bool
(4)reset
10.2、引用计数实现智能指针的总结
(1)基本原理仍然是释放智能指针对象时,调用其Deleter,再调用被绑定对象的析构来释放
(2)auto_ptr和unique_ptr都被实现为独占式,所以在=时必然发生占有权转移
(3)shared_ptr增加引用计数,好处是可以让多个智能指针对象,同时绑定一个被管理对象,本质上其实是避免了被管理对象被多次自动释放带来的错误,所以比unique_ptr更好用
10.3、shared_ptr的其他细节
(1)static_pointer_cast/dynamic_pointer_cast
(2)特化的原子操作(期望对复杂的结构进行无锁操作,而不用担心GC /内存泄漏)

11.weak_ptr与shared_ptr的关联和使用

参考:https://blog.csdn.net/albertsh/article/details/82286999

12.迭代器适配器

参考:http://c.biancheng.net/view/7255.html 与 cppreference

13.function封装器和可变参数模版

13.1、function封装器
参考:https://blog.csdn.net/gongjianbo1992/article/details/105160627/
13.2、可变参数模版
参考:https://blog.csdn.net/xiaohu2022/article/details/69076281
13.3、C++课程前3部分总结
(1)C++课程前3部分是主体,后2部分是扩展。
(2)前3部分学完,即可使用C++去做事,譬如GUI的qt、譬如AI的opencv
(3)后2部分是C++编程功底和优化、更深度理解C++的,建议有一定C++使用体验后再去学
(4)录制上也会先暂停C++去录制一些使用C++的其他课程,后面再找时间来讲后2部分扩展

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值