智能指针主要用于管理堆上分配的内存,它将一个普通指针封装为一个栈对象,当栈的生命周期结束后,会在析构函数中释放申请的内存,从而防止内存泄漏。(RAII技术)
#include<memory>
shared_ptr
C++11中常用得到智能指针为shared_ptr,它采用引用计数的方式记录当前内存资源被多少个指针使用,只有当引用计数为0时才会释放内存资源。
#include<memory>
shared_ptr<int> p=make_shared<int>(10);
int i=p.use_count();//查看引用计数
unique_ptr
独占被管理的资源。
weak_ptr
使用weak_ptr弱指针解决循环引用的问题,weak_ptr的构造函数不会修改引用计数的值,从而不会对对象进行内存管理,但是可以检测所管理对象是否已经被释放,从而避免非法访问。
循环引用
两个对象使用shared_ptr成员变量互相指向对方,使得引用计数失效,从而造成内存泄漏,从而造成内存泄漏。
#include<memory>
class ListNode
{
public:
int _date;
shared_ptr<ListNode> _previous;
shared_ptr<ListNode> _next;
};
int main()
{
shared_ptr<ListNode> Node1(new ListNode);
shared_ptr<ListNode> Node2(new ListNode);
Node1->_next=Node2;
Node2->_previous=Node1;
}