C++编程笔记(智能指针学习)

scoped_ptr

  • 拷贝构造和 =赋值操作均为私有,不允许
  • 内部重载了解引用(*)操作符和 ->操作符,操作与普通指针无异

用例

     //拷贝构造和赋值操作均为私有    利用模板
    scoped_ptr<string> p(new string("hello world"));//初始化一个指向string的指针
    cout << *p << '\n' << p->size() << '\n';//用法与普通指针一致
    assert(p);//用于判断指针是否为空
    p.reset();//指针重置
    //p++;//错误 智能指针只有* 和 ->操作符

unique_ptr

  • 与scoped_ptr极为相似
//与scoped极为相似
void testUnique() {
    //Unique基本功能与scope相同
    unique_ptr<int> p(new int);
    int *a = new int(123);
    assert(p);//测试指针是否有效;
    p.reset(a); //利用指针,使得指针重新指向一个新的对象(类型必须与初始化时相同)
    *p = 100;
    Show<int>(*p);
    p.reset();//置空
    //工厂函数
    //比使用new更为安全,且效率不低
    p = std::make_unique<int>(10);
    //p = boost::make_unique<int>(10);  /scoped_ptr没有这个函数,因为拷贝构造私有
    Show(*p);
}

shared_ptr

  • 可以拷贝,可以赋值(=)

案例

void testShared() {
    boost::shared_ptr<int> p(new int);
    *p = 100;
    boost::shared_ptr<int> p1(p);
    cout << "引用是否唯一:" << p.unique() << endl;//是否唯一,1为真,0为假
    p1.reset();//重置p1
    cout << "(reset后)引用是否唯一:" << p.unique() << endl;//是否唯一,1为真,0为假
    //p1.reset(new int);
    
    boost::shared_ptr<vector<int>> sp = boost::make_shared<vector<int>>(10, 2);//初始化添加10个2
    //boost::shared_ptr<int[]>sps=boost::make_shared<int[]>(10);大小为10的数组
    (*sp).push_back(10);
    sp->push_back(20);
    for (int &x: *sp) {
        cout << x << '\t';
    }
}

智能指针简单应用

void myfclose(ifstream *ifs) {
    cout << "文件关闭\n";
    ifs->close();
}

ifstream *myfopen(const char *path) {
    cout << path << "打开\n";
    return new ifstream(path, ios::in);
}

void testShared1() {
    //ifstream *fs = myfopen("./bridge.cpp");
    //巧用删除器,当智能指针销毁时会调用myfclose函数
    boost::shared_ptr<ifstream> fp(myfopen("/home/lhh/boost_1_77_0/LICENSE_1_0.txt"), myfclose);
    char buf;
    while ((buf = fp->get()) != EOF) {
        cout << buf;
    }

}

上述案例运用了shared_ptr的包含了删除器的构造函数

    template<class Y, class D> 
    shared_ptr( Y * p, D d ): px( p ), pn( p, static_cast< D&& >( d ) )
    {
        boost::detail::sp_deleter_construct( this, p );
    }
//D可以是个函数对象或者函数指针,只要能是的D(...)合法就没问题,离开作用域时,函数会调用D

智能指针简单应用

//使用智能指针指向数组
unique_ptr<char[]> p= make_unique<char[]>(50);
  • 通常我们都是使用unique_ptr管理数组,因为在C++17之前,shared_ptr还无法正确的释放数组资源,需要自己定义删除器,并且unique_ptr重载了下标运算符[],并且可以正确释放数组资源

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质?你是否想成为一名资深开发人员,想开发别人做不了的高性能程序?你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹? 那么C++就是你个人能力提升,职业之路进阶的不二之选。【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署;2.吊打一切关于C++的笔试面试题;3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块基础篇本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。进阶篇本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。提升篇:本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刀刀777999

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值