四、智能指针
Author: XFFer_
文章目录
01 直接内存管理(new/delete)、创建新工程观察内存泄漏
1 直接内存管理(new/delete)
2 创建新工程,观察内存泄漏
直接内存管理(new/delete)
C语言中是
malloc/free
定义初值
int *pointi = new int(100);
string *points = new string(5, 'a'); //"aaaaa"
vector<int> *pointv = new vector<int>{
1, 2, 3, 4, 5};
概念 “值初始化”:用()
来初始化
int *pointi = new int();
auto pointi_t = new auto(pointi);
//前面的auto推断出的是int **
推荐在delete
后将该指针设置成nullptr
C++中出现了智能指针,会帮助程序猿收回内存。
创建新工程,观察内存泄漏
MFC应用程序能够在一定程度上(程序推出的时候),帮助发现内存泄漏。
MFC:微软公司出的基础的程序框架(MFC基础类库),可以生成一个带窗口(带界面)的程序框架,MFC简化了很多界面开发工作。
快捷键 ctrl + ]
跳转到对应的{
或 }
02 new、delete探秘,智能指针概述、shared_ptr基础
1 new/delete探秘
new/delete是什么
operator new()和operator delete()
基本new如何记录分配的内存大小供delete使用
申请和释放一个数组
为什么new/delete、new[]/delete[]要配套使用2 智能指针总述
3shared_ptr
基础常规初始化(
shared_ptr
和new
配合)
make_shared
函数
new/delete探秘
new/delete是什么?
new/delete
类对象时,有初始化/释放的能力(调用构造函数/析构函数),这些是malloc/free
所不能的。
operator new()和operator delete()
new/delete是操作符,operater new()和operator delete()是函数
new
简单理解为做了两件事:a)分配内存(实际上通过operator new()
);b)给内存初始化delete
也做了两件事:a)反初始化(调用析构函数);b)释放内存(operator delete()
)
基本new如何记录分配的内存大小供delete使用
不同编译器new内部有不同的实现方式,new内部有记录机制,记录分配出多少内存。
申请和释放一个数组
int *p = new int[2];
delete[] p;
如果申请一个类数组,会在内存中存入该数组中类的个数,以便与调用等量的析构函数。
智能指针总述
- 裸指针:直接用
new
返回的指针,强大灵活,但是需要开发者全程维护。 - 智能指针:理解为“裸指针”进行了包装,能够“自动释放所指向的对象内存”。C++标准库std提供了四种智能指针:
- 都是类模版
auto_ptr
(C++98)已经被unique_ptr取代unique_ptr
(C++11):独占式指针。同一时间内,只有一个指针指向该对象shared_ptr
(C++11):共享式指针。多个指针指向同一个对象,最后一个指针被销毁时,这个对象会被销毁weak_ptr
(C++11)用来辅助shared_ptr
- 都是类模版
- 用来帮助我们进行动态分配对象(new出来的对象)的生命周期的管理。能够有效防止内存泄漏
shared_ptr基础
常规初始化(shared_ptr和new配合)
每个share_ptr的拷贝都指向相同的内存
工作原理:引用计数。只有最后一个指向该内存的shared_ptr
不需要再指向该对象时,才会析构这个对象。计数的作用是每增加一个shared_ptr
count + 1,销毁指针到count为0时,就会释放内存。
std::shared_ptr<int>