博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++ 智能指针
阅读量:6408 次
发布时间:2019-06-23

本文共 1837 字,大约阅读时间需要 6 分钟。

hot3.png

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

转载于:https://my.oschina.net/yizhangxyz/blog/670031

你可能感兴趣的文章
Win7 64bit 安装Mysql5 出错 无法启动服务。
查看>>
嵌入式 H264参数语法文档: SPS、PPS、IDR以及NALU编码规律
查看>>
初识Opserver,StackExchange的监控解决方案
查看>>
给大家讲解一下JavaScript与后台Java天衣无缝相结合
查看>>
探索HTML5之本地文件系统API - File System API
查看>>
javascript有用代码块(1)
查看>>
libevent 笔记
查看>>
PHP实现人人OAuth登录和API调用
查看>>
redis源码笔记 - initServer
查看>>
FindBugs工具常见问题
查看>>
ECSHOP报错误Deprecated: preg_replace(): The /e modifier is depr
查看>>
【iOS】iOS之Button segue弹出popOver消除(dismiss)问题
查看>>
java多线程系列5-死锁与线程间通信
查看>>
数据库分库分表
查看>>
腾讯Hermes设计概要——数据分析用的是列存储,词典文件前缀压缩,倒排文件递增id、变长压缩、依然是跳表-本质是lucene啊...
查看>>
小程序模板嵌套以及相关遍历数据绑定
查看>>
Systemd入门教程:命令篇(转)
查看>>
java随机范围内的日期
查看>>
linux包之diff
查看>>
spring事务学习(转账案例)(二)
查看>>