智能指针简介
相信各位使用C++编程的小伙伴都有过内存泄漏的困惑,确实,C++因为没有Java的垃圾回收机制,当程序员不能很好的管理自己所申请的内存时很容易出现内存泄漏的问题。不过虽然在语法机制上面C++有如此缺憾,但仍然给我们这种粗心大意的程序员提供了一个弥补错误的工具——智能指针模板类。首先看下列代码。
void remodel(string& str){
string * ps = new string(str);
...
return;
}
如代码所示,指针ps为局部变量,当函数返回时,ps被销毁,但ps所指向的堆内存并不会销毁,当然只要我们别忘了在函数返回时销毁这段内存就没有问题,但仅仅依赖于我们时刻不忘回收堆内存绝不是一个好方法。所以如果编译器能帮助我们判断何时回收堆内存就好了,这时我们想起了c++类,在栈上构造的类对象销毁时会自动调用其析构函数,如果我们创造一个类,其中保存一个指向堆内存的指针,这个类在栈上构造,在其生存期到期时编译器自动调用其析构函数析构其所指向的堆内存,这不就解决我们的问题了吗!很幸运,C++11标准中提供了这样的模板类shared_ptr、unique_ptr、weak_ptr。除此之外还有个auto_ptr(C++98标准),但因为种种的缺陷已经被遗弃不再讲解。有关这三个模板类的使用详解我建议大家转到下面三个链接,里面讲的非常详细,也非常抱歉暂时无法为大家讲解。
智能指针详解
shared_ptr;
unique_ptr;
weak_ptr;
在文章的最后需要指出两个非常重要的点,大家使用智能指针时要时刻注意。
- 智能指针绑定的内存一定要是堆内存,这是因为智能指针底层使用delete,而delete用于非堆内存会出现错误,也就是说使用new分配内存时才能使用智能指针。
- 当new[]时只能使用unique_ptr,不可使用shared_ptr。