智能指针知识篇前言以及知识储备为什么需要智能指针unique_ptr最常用的智能指针之一shared_ptrweak_ptr前言以及知识储备我们在学习智能指针之前需要先了解RAII思想即Resource Acquisition Is Initialization资源获取即初始化对于这个知识链接: link点击此链接即可直接学习为什么需要智能指针正常情况下我们用指针去指向一个new出来的区域指针在函数结束后就消失了但是如果我们在指针消失前忘了delete掉new出来的空间就会导致内存泄漏。voidTest(){int*pnewint(10);// 忘记delete}为了让对象析构时自动deleteC11将unique_ptr、shared_ptr、weak_ptr正式纳入标准库。unique_ptr最常用的智能指针之一特点独占所有权即一个资源只能有一个主人。禁止拷贝创建语法#includememoryunique_ptrintp(newint(10));//方法一autopmake_uniqueint(10);//方法二推荐方法二中的auto指的是unique_ptr虽然这种智能指针不能拷贝但可以移动unique_ptrintp2move(p1);结果p1 nullptrp2拥有资源shared_ptr特点共享所有权即多个智能指针共同管理一个资源。(允许拷贝创建语法autopmake_sharedint(10)内部维护时存在引用计数。每当多一个shared指针指向同一个资源时计数加一。而我们如何知道计数计到几呢需要用到以下语法coutp1.use_count();当对象的生命周期结束时触发对象销毁每当有指向该资源的shared_ptr对象都销毁时引用计数就会减一直到归零自动进行delete。weak_ptr与shared_ptr的区别在于shared_ptr拥有所指向的对象weak_ptr观察所指向的对象weak_ptr不会增加引用计数。拥有者需要保证对象活着但观察者不需要。因此shared_ptrintspmake_sharedint(10);weak_ptrintwpsp;sp.use_count()仍然是1不会变成2有人会觉得这个weak_ptr存在意义不大。举一个例子classBclassA{public:shared_ptrBb;};classB{public:shared_ptrAa;};intmain(){shared_ptrApa(newA);shared_ptrBpb(newB);pa-bpb;pb-apa;}这段代码的引用计数永远不为0。原因pa指向A A1Pb指向B B1Pa-b指向B B2Pb-a指向A A2Main结束后A类里面的b指向BB类里面的a指向A导致引用计数始终不为0shared_ptr无法自动释放资源最终造成内存泄漏。而解决方法很简单classB{public:weak_ptrAa;};由于weak_ptr不会增加引用计数这会导致A与B有一个是1一个是2打破循环。