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. java~springboot(2022之后)~目录索引

    回到占占推荐博客索引 最近写了不过关于java,spring,微服务的相关文章,今天把它整理一下,方便大家学习与参考. java~springboot(2022之前)~目录索引 java~spring ...

  2. kubernetes 调度器

    调度器 kube-scheduler 是 kubernetes 的核心组件之一,主要负责整个集群资源的调度功能,根据特定的调度算法和策略,将 Pod 调度到最优的工作节点上面去,从而更加合理.更加充分 ...

  3. 使用filebeat收集k8s上pod里的容器日志配置文件模板

    具体使用有待商榷 filebeat.inputs: - type: container paths: - /var/log/containers/*.log processors: - add_kub ...

  4. Solutions:Elastic SIEM - 适用于家庭和企业的安全防护 ( 二)

  5. Solutions:Elastic SIEM - 适用于家庭和企业的安全防护 ( 五)

  6. rpm,docker,k8s三种方式安装部署GitLab服务

    rpm方式 源地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ wget https://mirrors.tuna.tsinghua ...

  7. [题解] Codeforces Dytechlab Cup 2022 1737 A B C D E 题解

    傻*Dytechlab还我rating!(不过目前rating还没加上去,据说E是偷的说不定要unrated) 实在没预料到会打成这样... 求点赞 点我看题 A. Ela Sorting Books ...

  8. Invalid bound statement (not found)出现原因和解决方法

    Invalid bound statement (not found)出现原因和解决方法 前言: 想必各位小伙伴在码路上经常会碰到奇奇怪怪的事情,比如出现Invalid bound statement ...

  9. VS Code For Web 深入浅出 -- 进程间通信篇

    在上一篇中,我们一起分析了 VS Code 整体的代码架构,了解了 VS Code 是由前后端分离的方式开发的.且无论前端是基于 electron 还是 web,后端是本地还是云端,其调用方式并无不同 ...

  10. 在Centos7上安装JDK1.8和tomcat8.5的步骤和过程(亲测可用)

    文章目录 1.在阿里云(Linux)Centos7上安装JDK1.8步骤过程 2.阿里云(Linux)centos7上安装Tomcat8.5步骤过程记录: 卸载JDK Centos7一般都会带有自己的 ...