CPP_C++11特性,智能指针

智能指针早就想学学了,据说很好用,趁着现在有空做个初步了解,后期做一两个小项目练练手。 1.sharedptr
shared
ptr用于指向相同的对象,使用引用计数,当被引用时+1,被析构时-1,当被拷贝时+1,被赋值时-1,为0则释放堆内存。sharedptr的引用计数是线程安全的,但是对象的读取需要加锁。(意思是内部关于引用、析构、释放这个引用计数的值是线程安全的,不用你操心,但是sharedptr是个类,他初始化后的对象需要加锁,不然可能死锁)

 初始化  std::shared_ptr<int> ptra=std::make_shared<int>(a);//初始化的第一种方法,make_shared
        std::shared_ptr<int> ptra2(ptra);//拷贝构造

eg.
int a=0; std::sharedptr ptra=std::makeshared(a); std::shared_ptr ptra1(ptra);//引用计数2

   int b=1;
   std::shared_ptr<int> ptrb=std:make_shared<int>(b);
   ptra1=ptrb.get();//ptra计数1,ptrb计数2

2.uniqueptr唯一的拥有所指对象,相当于绑定指针,且不允许有第二个uniqueptr指向同一对象,得益于RAII的特性,使得在出现异常的情况下,动态资源能够得以释放。uniqueptr的生命周期在其离开作用域后停止。uniqueptr指针与其所指对象的关系:在智能指针生命周期内,可以改变智能指针所指对象,如创建智能指针时通过构造函数指定、通过reset方法重新指定、通过release方法释放所有权、通过移动语义转移所有权。

eg.
std::uniqueptr uptr(new int(10)); //std::uniqueptr uptr2=uptr;//不允许 //std::uniqueptr uptr2(uptr)//不允许 std::uniqueptr uptr2=std::move(uptr)//转移所有权 uptr.release()//释放所有权

3.weakptr是不控制对象生命周期的智能指针,设计的初衷是为了解决shareptr循环引用导致的内存泄漏。将一个weakptr绑定到一个sharptr对象,不会增加shareptr的引用计数。一旦最后一个所指向对象的sharedptr被销毁,所指向的对象就会被释放,即使此时有weakptr指向该对象,所指向的对象依然被释放。(weakptr不影响指向对象的生命周期)

eg.
shareptr tp=makeshare("shexl"); weak_ptr wp=tp;

  因为weak_ptr实现的弱引用特性,使得weak_ptr可以用来避免share_ptr的循环引用。

eg.

class b;
class a{ public:share_ptr shb;};

class b{public: share_ptr sha;};

a * a1=new a;
b * b1=new b;
a->shb=b;
b->sha=a;

由于share_ptr的引用计数总是大于等于1,所以不会被释放,(有点死锁的概念)

4.auto_ptr已被C++11弃用~

panda

继续阅读此作者的更多文章