在学习异常的时候,异常有一个很大的缺陷,就是异常会导致执行流乱跳.从而可能会导致某些资源没有被及时得到释放等等问题.
例如这样的问题:
1 #include <iostream>
2 #include<vector>
3 using namespace std;
4 void fun()
5 {
6 int* arr = new int[10];
7 cout<<"arr"<<endl;
8 vector<int> v;
9 v.at(0); //at()函数在标准库处理错误的方式是抛异常,抛异常后就会跳到test()函数中,就不会执行下面的代码了,就导致了new出来的对象会存在内存泄漏
10 delete[] arr;
11 cout<<"释放arr"<<endl;
12 }
13 void test()
14 {
15 try
16 {
17 fun();
18 }
19 catch(exception e)
20 {
21 e.what();
22 }
23 }
24 int main()
25 {
26 test();
27 return 0;
28 }
上面的例子就由于抛异常而导致的执行流乱跳而内存泄漏. |
那么,为了解决这个问题,就出现了RAII.
RAII:Resource Acquisition Is Initialization资源分配即初始化.定义一个类来封装资源的分配和释放.在构造函数完成资源的分配和初始化,在析构函数中完成资源的清理,从而保证资源的正确初始化和释放. |
那么,上面的问题我们就可以通过封装一个类将析构和构造实现,然后在定义对象时就将其定义为封装的类的对象.
Auto_ptr.h
1 #pragma once
2 using namespace std;
3
4 template<class T>
5<