C++ 11重点总结1

智能指针

  • 智能指针:

    • C++11引入了四种智能指针: auto_ptr(已弃用)、unique_ptrshared_ptrweak_ptr。智能指针可以更有效地管理堆内存,并避免常见的内存泄漏问题。
  • shared_ptr: 自定义删除器。

    • shared_ptr使用引用计数来管理它指向的对象的生命周期。多个shared_ptr实例可以指向同一个对象,只有最后一个shared_ptr被销毁时,该对象才会被销毁。
    • 使用shared_ptr要注意的问题
      •  不要用一个原始指针初始化多个shared_ptr
      • 不要在函数实参中创建shared_ptr,因为编译器差异,没有明确指定参数顺序。
        function(shared_ptr<int>(new int), g()); //有缺陷
      • 通过shared_from_this()返回this指针。 解决引发两次析构问题,底层就是使用weak_ptr
        class A: public std::enable_shared_from_this<A>
        shared_ptr<A>GetSelf()
        {//return shared_ptr<A>(this); // 不要这么做return shared_from_this();     // 正确方式
        }

         

      • 避免循环引用
        A:shared_ptr  B:shared_ptr
        问题:A->B B->A 这种情况会导致内存泄漏,析构只进行-1次引用计数。解决:A:shared_ptr  B:weak_ptr 即可

  • unique_ptr:

    • unique_ptr是一种独占式的智能指针,不允许复制,但可以移动。它适用于管理应该有单一所有者的资源。
    • 讨论了unique_ptrshared_ptr之间的差异,如数组支持和自定义删除器。
    • 使用shared_ptr要注意的问题
      • 初始化灾难。new T会造成重复类型声明。代码可读性差
        unique_ptr<T> my_ptr(new T);
        unique_ptr<T> my_other_ptr = my_ptr;      // 报错,不能复制// 方法1:重复类型(不推荐)
        std::unique_ptr<ComplexObject> obj1(new ComplexObject(10, "example")
        );// 方法2:避免重复(推荐)
        auto obj2 = std::make_unique<ComplexObject>(10, "example");// 重复类型声明的潜在问题:
        // - 编译器需要多次处理相同类型
        // - 增加编译时间
        // - 可能导致目标代码膨胀

      • 数组支持。
        std::unique_ptr<int []> ptr(new int[10]);ptr[9] = 9;std::shared_ptr<int []> ptr2(new int[10]);  // 这个是不合法的
      • 删除器区别。需要指定删除器类型

        std::shared_ptr<int> ptr3(new int(1), [](int *p){delete  p;}); // 正确
        std::unique_ptr<int> ptr4(new int(1), [](int *p){delete  p;}); // 错误// 方法2:自定义更复杂的分配
        auto customDeleter = [](int* p) { // 可以添加额外的清理逻辑delete[] p; 
        };auto ptr2 = std::unique_ptr<int[], decltype(customDeleter)>(new int[5](), customDeleter
        );

  • weak_ptr:

    • weak_ptr是一种非拥有式的智能指针,用于观察由shared_ptr管理的对象的生命周期。它用于打破循环引用,防止内存泄漏。涵盖了基本用法、将this指针返回为weak_ptr以及解决循环引用问题。
    • 举个例子,监视某内存的释放。

      • std::weak_ptr<int> gw;void f(){if(gw.expired()) {cout << "gw无效,资源已释放";}else {auto spt = gw.lock();cout << "gw有效, *spt = " << *spt << endl;}}int main(){{auto sp  = atd::make_shared<int>(42);gw = sp;f();}f();return 0;}
    • weak_ptr使用注意事项

      • weak_ptr在使用前需要检查合法性。在使用wp前需要调用wp.expired()函数判断一下

  • 智能指针安全性:

    • 智能指针通常是安全的,但在多线程访问同一个shared_ptr对象时需要考虑线程安全性。
    • 当每个线程有自己的shared_ptr实例时,只要底层数据相同就是安全的。

右值引用和移动语义

关键点总结:

  1. 左值:可取地址的持久对象
  2. 右值:临时对象,不可取地址。 比如临时变量,字面量常量 
    1. 右值的关键特征

    2. 不可取地址
    3. 只能出现在赋值表达式右侧
    4. 没有持久的内存位置
    5. 可以被移动,但不能被修改
    6. 通常是临时的、短暂的对象
  3. 右值引用可以延长临时对象生命周期
  4. std::move 无条件地将对象转换为右值
  5. 移动语义避免不必要的深拷贝
  6. 万能引用可以接受左值和右值
    1. template<typename T>
      // 引用折叠规则
      // T& & -> T&
      // T&& & -> T&
      // T& && -> T&
      // T&& && -> T&&
      void forwardingFunc(T&& arg) {// arg 可能是左值引用或右值引用someFunc(std::forward<T>(arg));
      }void testUniversalRef() {int x = 10;forwardingFunc(x);        // T 推导为 int&forwardingFunc(10);       // T 推导为 int
      }

  7. C++11 在性能上做了很大的改进,最大程度减少了内存移动和复制,通过右值引用、 forward、 emplace 和一些无序容器我们可以大幅度改进程序性能。 右值引用仅仅是通过改变资源的所有者来避免内存的拷贝,能大幅度提高性能。 forward 能根据参数的实际类型转发给正确的函数。 emplace 系列函数通过直接构造对象的方式避免了内存的拷贝和移动。 无序容器在插入元素时不排序,提高了插入效率,不过对于自定义 key 时需要提供 hash 函数和比 较函数

 匿名函数lambda

 ​​​​​​​

 迭代器

使用一个 iterator 对象来指向一个可以修改的容器元素,使用一个 const_iterator 对象来指向一个不能 修改 的容器元素。

每种容器所支持的迭代器类型决定了这种容器是否可以在指定的 STL 算 法中使用。 

const只能读,reverser是反向。正常使用都是iterator。

 

 详细了解

C++ 参考手册 - cppreference.com

C++面试常见题目7_STL之map与unordered_map(红黑树VS哈希表)_map 和unordermap区别面试-CSDN博客

 

 

学习资料分享

0voice · GitHub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/62098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年nvm保姆级安装教程

需求&#xff1a;当前我的nodejs的版本是6.14.10&#xff0c;想切换为更高的版本。故使用nvm工具来实现不同node版本之间的切换 目录 一、删除node二、nvm安装三、配置nvm镜像四、安装所需要的nodejs版本nvm常用命令 一、删除node 第一步&#xff1a;首先在控制面板删除node.j…

Flink--API 之 Source 使用解析

目录 一、Flink Data Sources 分类概览 &#xff08;一&#xff09;预定义 Source &#xff08;二&#xff09;自定义 Source 二、代码实战演示 &#xff08;一&#xff09;预定义 Source 示例 基于本地集合 基于本地文件 基于网络套接字&#xff08;socketTextStream&…

【三维生成】Edify 3D:可扩展的高质量的3D资产生成(英伟达)

标题&#xff1a;Edify 3D: Scalable High-Quality 3D Asset Generation 项目&#xff1a;https://research.nvidia.com/labs/dir/edify-3d demo&#xff1a;https://build.nvidia.com/Shutterstock/edify-3d 文章目录 摘要一、前言二、多视图扩散模型2.1.消融研究 三、重建模型…

Android Framework禁止弹出当前VOLTE不可用的提示窗口

文章目录 VoLTE简介VoLTE 的优势 当前VOLTE不可用的弹窗弹窗代码定位屏蔽弹出窗口 VoLTE简介 VoLTE&#xff08;Voice over LTE&#xff09;是一种基于4G LTE网络的语音通话技术。它允许用户在4G网络上进行高质量的语音通话和视频通话&#xff0c;而不需要回落到2G或3G网络。V…

Element UI 打包探索【3】

目录 第九个命令 node build/bin/gen-cssfile gulp build --gulpfile packages/theme-chalk/gulpfile.js cp-cli packages/theme-chalk/lib lib/theme-chalk 至此&#xff0c;dist命令完成。 解释why Element UI 打包探索【1】里面的why Element UI 打包探索【2】里面…

去哪儿大数据面试题及参考答案

Hadoop 工作原理是什么&#xff1f; Hadoop 是一个开源的分布式计算框架&#xff0c;主要由 HDFS&#xff08;Hadoop 分布式文件系统&#xff09;和 MapReduce 计算模型两部分组成 。 HDFS 工作原理 HDFS 采用主从架构&#xff0c;有一个 NameNode 和多个 DataNode。NameNode 负…

深度学习中的梯度下降算法:详解与实践

梯度下降算法是深度学习领域最基础也是最重要的优化算法之一。它驱动着从简单的线性回归到复杂的深度神经网络模型的训练和优化。作为深度学习的核心工具&#xff0c;梯度下降提供了调整模型参数的方法&#xff0c;使得预测的结果逐步逼近真实值。本文将从梯度下降的基本原理出…

VM+Ubuntu18.04+XSHELL+VSCode环境配置

前段时间换了新电脑&#xff0c;准备安装Linux学习环境&#xff1a;VM虚拟机、Ubuntu18.04操作系统、XSHELL、XFTP远程连接软件、VSCode编辑器等&#xff0c;打算把安装过程记录一下。 1. 虚拟机介绍 为什么要用虚拟机&#xff1f; 想学习Linux操作系统&#xff0c;一般有3种…

《Opencv》基础操作<1>

目录 一、Opencv简介 主要特点&#xff1a; 应用领域&#xff1a; 二、基础操作 1、模块导入 2、图片的读取和显示 &#xff08;1&#xff09;、读取 &#xff08;2&#xff09;、显示 3、 图片的保存 4、获取图像的基本属性 5、图像转灰度图 6、图像的截取 7、图…

【Android】ARouter的使用及源码解析

文章目录 简介介绍作用 原理关系 使用添加依赖和配置初始化SDK添加注解在目标界面跳转界面不带参跳转界面含参处理返回结果 源码基本流程getInstance()build()navigation()_navigation()Warehouse ARouter初始化init帮助类根帮助类组帮助类 completion 总结 简介 介绍 ARouter…

国内首家! 阿里云人工智能平台 PAI 通过 ITU 国际标准测评

近日&#xff0c;阿里云人工智能平台 PAI 顺利通过中国信通院组织的 ITU-T AICP-GA&#xff08;Technical Specification for Artificial Intelligence Cloud Platform&#xff1a;General Architecture&#xff09;国际标准和《智算工程平台能力要求》国内标准一致性测评&…

.NET9 - Swagger平替Scalar详解(四)

书接上回&#xff0c;上一章介绍了Swagger代替品Scalar&#xff0c;在使用中遇到不少问题&#xff0c;今天单独分享一下之前Swagger中常用的功能如何在Scalar中使用。 下面我们将围绕文档版本说明、接口分类、接口描述、参数描述、枚举类型、文件上传、JWT认证等方面详细讲解。…

【单点知识】基于PyTorch进行模型部署

文章目录 0. 前言1. 模型导出1.1 TorchScript1.1.1 使用 torch.jit.trace1.1.2 使用 torch.jit.script 1.2 ONNX1.2.1 导出为 ONNX 格式 1.3 导出后的模型加载1.3.1 加载 TorchScript 模型1.3.2 加载 ONNX 模型 2. 模型优化2.1 模型量化2.2 模型剪枝 3. 服务化部署3.1 Flask 部…

java基础知识(常用类)

目录 一、包装类(Wrapper) (1)包装类与基本数据的转换 (2)包装类与String类型的转换 (3)Integer类和Character类常用的方法 二、String类 (1)String类介绍 1)String 对象用于保存字符串,也就是一组字符序列 2)字符串常量对象是用双引号括起的字符序列。例如:&quo…

Servlet细节

目录 1 Servlet 是否符合线程安全&#xff1f; 2 Servlet对象的创建时间&#xff1f; 3 Servlet 绑定url 的写法 3.1 一个Servlet 可以绑定多个url 3.2 在web.xml 配置文件中 url-pattern写法 1 Servlet 是否符合线程安全&#xff1f; 答案&#xff1a;不安全 判断一个线程…

w~视觉~3D~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/12538137 #SIF3D 通过两种创新的注意力机制——三元意图感知注意力&#xff08;TIA&#xff09;和场景语义一致性感知注意力&#xff08;SCA&#xff09;——来识别场景中的显著点云&#xff0c;并辅助运动轨迹和姿态的预测…

fastjson不出网打法—BCEL链

前言 众所周知fastjson公开的就三条链&#xff0c;一个是TemplatesImpl链&#xff0c;但是要求太苛刻了&#xff0c;JNDI的话需要服务器出网才行&#xff0c;BCEL链就是专门应对不出网的情况。 实验环境 fastjson1.2.4 jdk8u91 dbcp 9.0.20 什么是BCEL BCEL的全名应该是…

GitLab使用操作v1.0

1.前置条件 Gitlab 项目地址&#xff1a;http://******/req Gitlab账户信息&#xff1a;例如 001/******自己的分支名称&#xff1a;例如 001-master&#xff08;注&#xff1a;master只有项目创建者有权限更新&#xff0c;我们只能更新自己分支&#xff0c;然后创建合并请求&…

MATLAB GUI设计(基础)

一、目的和要求 1、熟悉和掌握MATLAB GUI的基本控件的使用及属性设置。 2、熟悉和掌握通过GUIDE创建MATLAB GUI的方法。 3、熟悉和掌握MATLAB GUI的菜单、对话框及文件管理框的设计。 4、熟悉和掌握MATLAB GUI的M文件编写。 5、了解通过程序创建MATLAB GUI的方法。 二、内…

RabbitMQ简单应用

概念 RabbitMQ 是一种流行的开源消息代理&#xff08;Message Broker&#xff09;软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP - Advanced Message Queuing Protocol&#xff09;。RabbitMQ 通过高效的消息传递机制&#xff0c;主要应用于分布式系统中解耦应用…