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重载了下标运算符[],并且可以正确释放数组资源

C++编程笔记(智能指针学习)的更多相关文章

  1. Qt 智能指针学习(7种指针)

    Qt 智能指针学习 转载自:http://blog.csdn.net/dbzhang800/article/details/6403285 从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ ...

  2. c++学习笔记——智能指针

    智能指针是为了便于管理动态内存,能够自动管理释放所指向的对象. 智能指针共有三种:1.shared_ptr允许多个指针指向同一个对象:2.unique_ptr独占所指向的对象:3.weak_ptr是一 ...

  3. C++的智能指针学习笔记(初)

    C++ primer plus 16.2节介绍了auto_ptr,该模板类在C++11中已弃用,目前已被shared_ptr代替. auto_ptr又叫做智能指针,用于管理动态内存分配的用法. 为什么 ...

  4. [C/C++] 智能指针学习

    转自:http://blog.csdn.net/xt_xiaotian/article/details/5714477 一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存 ...

  5. Android 智能指针学习 一

    Android5.1 中智能指针涉及的文件如下: system/core/include/utils/RefBase.h system/core/libutils/RefBase.cpp system ...

  6. Qt 智能指针学习(7种QT的特有指针)

    从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ #include <QApplication> #include <QLabel> int main(int arg ...

  7. Qt 智能指针学习(7种QT智能指针和4种std智能指针)

    从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ #include <QApplication> #include <QLabel> int main(int arg ...

  8. Qt 智能指针学习

    原地址:http://blog.csdn.net/dbzhang800/article/details/6403285 从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ #include & ...

  9. [转]Qt 智能指针学习

    从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ #include <QApplication> #include <QLabel> int main(int arg ...

  10. c++——智能指针学习(shared_ptr和weak_ptr)

    先看一个例子:Stark和Targaryen家族你中有我,我中有你.我们设计以下类企图避免内存泄漏,使得析构函数都能调用到: #include<iostream> #include< ...

随机推荐

  1. Kubernetes DevOps: Harbor

    Harbor 是一个 CNCF 基金会托管的开源的可信的云原生 docker registry 项目,可以用于存储.签名.扫描镜像内容,Harbor 通过添加一些常用的功能如安全性.身份权限管理等来扩 ...

  2. 官方文档采用Docker方式安装

    官方文档地址:https://github.com/grafana/loki/tree/master/production The Docker images for Loki and Promtai ...

  3. Docker搭建自己的Gitlab CI Runner

    转载自:https://cloud.tencent.com/developer/article/1010595 1.Gitlab CI介绍 CI:持续集成,我们通常使用CI来做一些自动化工作,比如程序 ...

  4. 史上最全的selenium三大等待介绍

    一.强制等待 1.设置完等待后不管有没有找到元素,都会执行等待,等待结束后才会执行下一步 2.实例 driver = webdriver.Chrome() driver.get("https ...

  5. echarts 改变个别省份的边界线颜色

    想要实现地图,首先要引入china.js文件,如果有引入就直接调过本步骤去下方看代码,没有引入可以点击下方链接自行Ctrl c + Ctrl v china.js import "../.. ...

  6. day44-反射03

    Java反射03 3.通过反射获取类的结构信息 3.1java.lang.Class类 getName:获取全类名 getSimpleName:获取简单类名 getFields:获取所有public修 ...

  7. proxy解决跨域问题

    首先我们在本地开发,域名都是localhost,当我们需要请求后台数据时,就会出现跨域的问题 下面就是在vue.config.js配置文件里: devServer: {     proxy: {    ...

  8. pgsql 的问题

    pgsql 怎么插入inet类型的数据?insert into table (remote_addr) values ( ?::INET); pgsql如何截取时间的精度 select  create ...

  9. 把两个数据结构相同的数组(数组下有n个对象)合并成一个数组

    数据拼接 有一个数组 let arr1 = [ {name:''lili",age:14}, {name:''小明",age:16}, {name:''张三",age:2 ...

  10. Linux Block模块之deadline调度算法代码解析

    1 总体说明 Deadline调度器对一个请求的多方面特性进行权衡来进行调度,以期望既能满足块设备扇区的顺序访问又能兼顾到一个请求不会在队列中等待太久导致饿死.Deadline调度器为了兼顾这两个方面 ...