c++ 智能指针

匆匆过客 提交于 2019-12-27 21:37:25

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

1 auto_ptr。智能指针销毁的时候自动delete所包含的指针。对象只能被一份智能指针持有。通过智能指针的复制构造函数会将前一个的指针置为null

使用方式如下:

class Person{
    std::string name;
public:
    Person()
    :name("kk"){
        std::cout<<"construct Person"<<std::endl;
    }
    ~Person(){
        std::cout<<"deconstruct Person"<<std::endl;
    }
    void show(){
        std::cout<<"show person:  " + name<<std::endl;
    }
    void show1(){
        std::cout<<"show person" <<std::endl;
    }
};

auto_ptr<Person> ptr(new Person());
ptr->show();//ok
ptr.get()->show();//ok

auto_ptr<Person> ptr1= ptr;
ptr1->show();//ok
ptr->show();//错误。一旦通过ptr1= ptr复制后,智能指针包含的的指针即被清空变为null了(注意这个地方若是改为ptr->show1()则正常运行,因为未使用到this指针)
ptr.get()为null


2 unique_ptr。取代了auto_ptr。实际上他禁止了智能指针的复制。解决了包含无效指针的对象。

使用方式如下:

unique_ptr<Person> ptr(new Person());
ptr->show();
unique_ptr<Person> ptr1 = ptr;//错误,无法复制

3 shared_ptr。利用引用计数的原则对指针进行管理。他无法解决2个对象的环状引用,比如A对象包含B对象的智能指针,B包含A的智能指针。

使用方式如下:
shared_ptr<Person> s_ptr(new Person());
s_ptr->show();
    
long count = s_ptr.use_count();//获取引用计数,为1
cout<<count<<endl;
    
shared_ptr<Person> s_ptr1 = s_ptr;
s_ptr1->show();
 
count = s_ptr.use_count();// 引用计数为2
cout<<count<<endl;
s_ptr1.reset();//清除所持有的指针,引用计数减一
引用计数count,存放在shared_ptr第一次使用时分配的数据__cntrl_(new出的对象)里面,在以后的shared_ptr的复制中,也会传递__cntrl_,以达到共享引用计数的目的。

 

4 weak_ptr。正因为shared_ptr无法解决环状引用,所以出现了weak_ptr,他配合shared_ptr使用,用于判断shared_ptr智能指针包含的对象是否被释放。他本身不会增减对象使用次数。

使用方式如下:

shared_ptr<Person> sp(new Person());
std::cout<<sp.use_count()<<std::endl;

weak_ptr<Person> wp(sp);//引用计数不增加
wp->show();//错误,不具有指针行为
std::cout<<sp.use_count()<<std::endl;
if(!wp.expired()){
    shared_ptr<Person> sp2 = wp.lock();//获取一个shared_ptr,引用计数增加
    sp2->show();
    std::cout<<wp.use_count()<<std::endl;
}
std::cout<<wp.use_count()<<std::endl;//sp2销毁,引用计数减少
sp.reset();
std::cout<<wp.expired()<<std::endl;//true,已经过期,指向的shared_ptr已经不持有指针
std::cout<<wp.lock()<<std::endl;//无法获得shared_ptr

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!