智能指针这个东西想必学过C++的人都应该听说过或者使用过,但是应该有一些人和我一样对其只有一点浅显的认识,今天查了一些关于智能指针的资料,下面对其做一些整理:
为什么要有智能指针
在用C++动态内存分配的时候,使用new操作获取了一块内存,那么一定要在合适的地方将其delete掉,否则就会造成内存泄漏,这一点都明白,但是实际操作的时候总是会忘记这个delete操作,而智能指针就是为了避免这样一个问题。智能指针通常都是一个类,它包含一个指针成员p,这个指针指向new得到的内存块,最简单的智能指针会在自己的析构函数处调用delete p以实现自动delete。
C++11中智能指针包括四种:auto_ptr、weak_ptr、shared_ptr、unique_ptr,其中auto_ptr就是上面所说的那样一种最简单的智能指针,但是它存在很大的缺陷:当有两个不同的auto_ptr指向相同的一块内存的时候,由于auto_ptr在析构的时候会delete掉内存块,那么这两个auto_ptr必然会按先后顺序对这块内存做delete,也就是说一块内存会被delete两次,这会导致很严重的后果。因此通常是不考虑使用auto_ptr的,后面的讨论也不会涉及到auto_ptr。
shared_ptr
为了避免auto_ptr的问题,shared_ptr采用引用计数的方法,当一个shared_ptr指向一块内存的时候,这块内存的引用计数就会+1;当一个shared_ptr的作用域结束的时候,这块内存的引用计数就会-1。当内存的引用变为0的时候才会去调用delete方法,看一个具体的例子:
#include <memory>
#include <iostream>
using namespace std;
class A
{
public:
A() { cout << " Create A ! " << endl; };
~A() { cout << " Delete A ! " << endl; };
};
void Test( shared_ptr<A> p2 )
{
shared_ptr<A> p1( p2 );
}
int main()
{
shared_ptr<A> p(new A);
Test(p);
cout << " Test Finished ! " << endl;
return 0;
}
它的输出结果为:
可以看到在Test结束之后,p1就被销毁掉了,但是此时还并没有对A做delete,因为在main函数中还有一个p享有A的内存,只有在p也被销毁之后,才会对A做delete。
对于shared_ptr的使用有一些需要注意的地方:
1.shared_ptr的初始化问题:从上面就可以看出shared_ptr可以通过一个裸指针或者另一个shared_p