异常中内存的释放
string* s = new string("sss");
delete s;
一般情况下,使用动态开辟的内存空间只要在程序结束之前将其释放即可。
double div()
{
int a, b;
cin >> a >> b;
if (b == 0)
{
throw "Dibision by zero condition!";
}
return (double)a / (double)b;
}
void Fun()
{
int* p1 = new int;
int* p2 = new int;
try
{
div();
}
catch(...)
{
delete p1;
delete p2;
throw;
}
delete p1;
delete p2;
}
int main()
{
try
{
Fun();
}
catch (const char* e)
{
//在 C++ 的标准库中,what() 函数通常是异常类的成员函数,
// 用于获取异常对象所携带的描述异常信息的字符串。
cout << e << endl;
}
return 0;
}
可能出现的问题:
- 如果p1这里new抛异常会怎么样?
- 如果p2这里new抛异常会怎么样?
- 如果div调用这里同样抛出异常会出现什么情况?
在存在异常的情况下,存在多种情况的动态开辟内存空间,可能会导致内存泄漏。
内存泄漏
内存泄漏:内存泄漏是指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存之后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统,后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。
int main()
{
//1.内存申请后忘记释放
int* p1 = (int*)malloc(sizeof(int));
int* p2 = new int;
//2.异常安全的问题
int* p3 = new int[10];
//Fun()函数抛异常而导致p3没有释放
Fun();
delete[] p3;
return 0;
}
内存泄漏分类:
在C/C++程序中,一般关心俩种方面的内存泄漏:
- 堆内存泄漏(Heap leak):堆内存指的是程序执行中依据需要通过malloc / calloc / realloc / new等从堆中分配的一块内存,用完后必须通过调用相应的的free或者delete删掉。假设程序的设计错误导致这部分内存没有被释放,那么以后这部分空间将无法再被使用,就会产生Heap Leak。
- 系统资源泄漏:指的是程序使用系统分配的资源,比如套接字、文件描述符、管道等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定。