0. 引言
为什么需要智能指针?
先看看下面一段程序:
int div()
{
int a, b;
cin >> a >> b;
if (b == 0)
throw invalid_argument("除0错误");
return a / b;
}
void Func()
{
// 1、如果p1这里new 抛异常会如何?
// 2、如果p2这里new 抛异常会如何?
// 3、如果div调用这里又会抛异常会如何?
int* p1 = new int;
int* p2 = new int;
cout << div() << endl;
delete p1;
delete p2;
}
int main()
{
try
{
Func();
}
catch (exception& e)
{
cout << e.what() << endl;
}
return 0;
}
在上述例子中,在p2处的new和div()中任意一处抛出异常,都会导致内存泄漏,为了防止此种情况发生,就有了智能指针。
现在可以回答开头的问题了:
智能指针的设计初衷是为了解决手动管理动态内存时容易出现的一系列问题,例如内存泄漏、悬空指针、重复释放等。传统的手动内存管理依赖于 new
和 delete
,这要求程序员必须显式地分配和释放资源。然而,手动管理容易导致错误,特别是在异常、复杂的控制流或多线程环境中。因此,引入智能指针不仅提升了代码的安全性,还增强了可维护性和可读性。
那么何为内存泄漏呢?
1. 内存泄漏
1.1 何为内存泄漏
内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
1.2 内存泄漏的危害
长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现
内存泄漏会导致响应越来越慢,最终卡死。
1.3 内存泄漏的类别
堆内存泄漏(Heap leak):
堆内存指的是程序执行中依据须要分配通过malloc / calloc / realloc / new等从堆中分配的一
块内存,用完后必须通过调用相应的 free或者delete 删掉。假设程序的设计错误导致这部分
内存没有被释放,那么以后这部分空间将无法再被使用,就会产生Heap Leak。
系统资源泄漏:
指程序使用系统分配的资源,比方套接字、文件描述符、管道等没有使用对应的函数释放
掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定
2. 智能指针
2.1 智能指针的用法及原理
0. RAII
RAII