标签:
C++没有提供垃圾回收机制,C++11提供的智能指针能够在一定程度上解决C++内存泄漏的问题。
C++11提供了共享智能指针(shared_ptr),独占智能指针(unique_ptr),弱引用指针指针(weak_ptr),使用时需要引用<memory>
智能指针本质上存储动态分配(堆)对象的指正的模板类,用于对堆对象的生存期进行控制,确保在离开指针作用域时,能够自动正确的销毁动态分配的堆对象,
防止堆内存泄漏。
1. std::shard_ptr通常用于多个智能指针同时使用同一个内存资源时,它的内部使用引用计数计数,每次使用它一次,内部引用数增加1;反之,析构一次,引用计数减1;
减为0时,删除所指向的堆内存。
1.1初始化:推荐使用make_shared<T>
std::shared_ptr<int> p1(new int(1)); //构造函数初始化 auto p2=std::make_shared<int>(1); //make_shared<T> //std::shared_ptr<int> p2=std::make_shared<int>(1); int *pi=new int(1); std::shard_ptr<int> p3(pi);
1.2使用方法与普通的原始指针相同
if(p1) //判断shared_ptr是否为空 { std::cout<<"p1 is not null"<<endl; cout<<*p1<<endl; //获取指针指向对象的值
}
int *p=p1.get(); //获取原始指针
1.3shared_ptr的最大的一个陷阱是循环引用,循环引用会导致堆内存无法正确释放,导致内存泄漏。
下面是典型的实例,测试表明堆对象并没有释放,只是引用计数由2减少为1
#include <iostream> #include <memory> struct A; struct B; struct A{ std::shared_ptr<B> bptr; A(){std::cout<<"A is created"<<std::endl;} ~A(){std::cout<<"A is deleted!"<<std::endl;} }; struct B{ std::shared_ptr<A> aptr; B(){std::cout<<"B is created!"<<std::endl;} ~B(){std::cout<<"B is deleted!"<<std::endl;} }; std::weak_ptr<A> wpa; void testPtr() { std::shared_ptr<A> ap(new A); std::shared_ptr<B> bp(new B); ap->bptr=bp; bp->aptr=ap; wpa=ap; //weak_ptr获取当前观测资源的引用计数 std::cout<<wpa.use_count()<<std::endl; //ouput 2 } int main() { testPtr(); std::cout<<wpa.use_count()<<std::endl; //output 1return 0; }
2.unique_ptr用于只有一个智能指针管理资源或者管理数组;
它是一个独占型的智能指针,它不予许其他的智能指针共享同一块内存。
不予许通过赋值将一个unique_ptr给另外一个unique_ptr.
通过std::move函数转移堆对象的所有权
std::unique_ptr<int> ptri1(new int(1)); //std::unique_ptr<int> ptri2=ptri1; // 不能赋值 std::unique_ptr<int> ptri2= std::move(ptri1); //转移所有权//std::cout<<*ptri1<<std::endl; //失去所有权 std::cout<<*ptri2<<std::endl; //获得所有权
注:unique_ptr除了独占性外,unique还可以指向一个数组
//std::shared_ptr<int []> ptr3(new int[10]);
std::unique_ptr<int []> ptr4(new int[10]);
ptr4[9]=9;
3.weak_ptr:用于监视shared_ptr,它不管理shared_ptr内部的指针,
没有重载*和->,不共享指针,不能操纵资源。
1)通过use_count(),获取当前观测资源的引用计数。实例见上
2)通过expired()方法判断资源是否释放
if(wp.expired())
{
std::cout<<"not expired!"<<endl;
}
3)lock()方法可以获取监视的shared_ptr对象
标签:
原文地址:http://www.cnblogs.com/wxquare/p/4759020.html