为什么要有智能指针
C++的内存分为两种,栈和堆。栈中的内存使用之后不需要程序员去释放,会被自动释放。而在堆中分配的内存,是不能自动回收,需要程序员通过书写代码去回收。(malloc在堆中分配的内存由free来回收,New在堆中分配的内存由delete来回收。)
如何智能回收内存
借助RAII机制,RAII(Resource Acquisition Is Initialization),是C++采用的一种管理资源的方式。RAII是采用栈和依构造、析构函数的特性来管理资源。文字描述不够清晰,我们用代码来演示:
void test()
{
ClassA *pClassA = new ClassA();
....
delete pClassA;
}
上诉代码表面看上去并没有问题,但在实际使用时,会经常有问题。比如在delete之前,函数退出了,那么这里就会发生内存泄漏。
前面说了,智能指针是依托栈和构造、析构的机制。如果我们把指针封装成一个类,类的构造函数分配内存,析构函数中释放内存。
在函数的最初,使用这个类构造对象,构造完,这个指针对象就指向了一块堆内存,可以使用这块内存。但是,这个指针对象在函数中是局部变量,是存储在函数栈中的。当函数结束时,该函数栈中所有的局部变量都会被释放,所以刚才构造的指针对象就会被销毁。而销毁一个对象,就会自动调用它的析构函数,从而释放刚才分配的堆内存。