码迷,mamicode.com
首页 > 编程语言 > 详细

C++11 智能指针

时间:2015-08-26 15:20:36      阅读:338      评论:0      收藏:0      [点我收藏+]

标签:

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对象

 

C++11 智能指针

标签:

原文地址:http://www.cnblogs.com/wxquare/p/4759020.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!