C++——智能指针

一、内存泄露

1.1 内存泄露的概念及危害

什么是内存泄露?

内存泄露是指因为疏忽或者错误造成程序未能释放已经不在使用的内存的情况。内存泄露并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

内存泄露的危害

长期运行的程序出现内存泄露,影响很大,如操作系统、后台服务等等,出现内存泄露会导致响应越来越慢,最终卡死。

void MemoryLeaks()
{
	// 1、内存申请了忘记释放
	int* p1 = (int*)malloc(sizeof(int));
	int* p2 = new int;

	// 2、异常安全问题
	int* p3 = new int[10];

	// 这里Func函数抛异常导致delete[] p3未执行,p3没被释放
	Func();

	delete[] p3;
}

1.2 内存泄露分类

  • 堆内存泄露(Heap leak)

堆内存是指程序执行中依据须要分配通过malloc/calloc/realloc/new等从堆中分配的一块内存,用完后必须通过调用相应的free或者delete删掉。假设程序的实际错误导致这部分内存没有被释放,那么以后这部分空间将无法再被使用,就会产生Heap leak。

  • 系统资源泄露

指程序使用系统分配的资源,比如套接字、文件描述符、管道等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定。

1.3 如何避免内存泄露

  1. 工程前期良好的设计规范,养成良好的编码规范,申请的内存空间记着匹配的去释放。但是如果碰上异常时,就算注意释放了,还是可能会出问题。
  2. 采用RAII思想或者智能指针来管理资源。
  3. 出问题了使用内存泄露工具检测。

【总结】内存泄露非常常见,解决方案分为两种:1、事前预防型。如智能指针等。2、事后查错型。如泄露检测工具。

二、智能指针

你可能感兴趣的:(C++,c++)