当前位置: 首页 > news >正文

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

相关文章:

C++ 11重点总结1

智能指针 智能指针: C11引入了四种智能指针: auto_ptr(已弃用)、unique_ptr、shared_ptr和weak_ptr。智能指针可以更有效地管理堆内存,并避免常见的内存泄漏问题。 shared_ptr: 自定义删除器。 shared_ptr使用引用计数来管理它指向的对象的生命周期。多个shared_ptr实例可以指向…...

海康VsionMaster学习笔记(学习工具+思路)

一、前言 VisionMaster算法平台集成机器视觉多种算法组件&#xff0c;适用多种应用场景&#xff0c;可快速组合算法&#xff0c;实现对工件或被测物的查找测量与缺陷检测等。VM算法平台依托海康威视在图像领域多年的技术积淀&#xff0c;自带强大的视觉分析工具库&#xff0c;可…...

基于Python语言的Web爬虫设计源码

基于Python语言的Web爬虫设计源码地址 该项目是一个基于Python语言的Web爬虫设计源码&#xff0c;包含20个文件&#xff0c;其中18个为Python源代码文件&#xff0c;1个Markdown文件用于文档说明&#xff0c;以及1个配置文件。该爬虫专注于网络信息的抓取与处理。 关键词 Py…...

学习日志 --A5rZ

24.11.27 0001:2024 强网杯青少年专项赛 EnterGam 复现已完成 0002:在x86上模拟arm64(搁置,原因:资料过少,可行性过低) 0003:2024 强网杯青少年专项赛 Flip_over 复现终止(无arm真机) 0004: 开始复现 2024 强网杯青少年专项赛 journey_story...

JVM_垃圾收集器详解

1、 前言 JVM就是Java虚拟机&#xff0c;说白了就是为了屏蔽底层操作系统的不一致而设计出来的一个虚拟机&#xff0c;让用户更加专注上层&#xff0c;而不用在乎下层的一个产品。这就是JVM的跨平台&#xff0c;一次编译&#xff0c;到处运行。 而JVM中的核心功能其实就是自动…...

Javascript Insights: Visualizing Var, Let, And Const In 2024

11/2024 出版 MP4 |视频&#xff1a;h264&#xff0c; 19201080 |音频&#xff1a;AAC&#xff0c;44.1 KHz 语言&#xff1a;英语 |大小&#xff1a; 2.96 GB |时长&#xff1a; 5 小时 34 分钟 为所有认真的 JavaScript 开发人员可视化与 VAR、LET、CONST 和 EXECUTON CONTE…...

KL散度改写为一个可用于优化的形式

理解 KL 散度及其公式推导过程 在信息论和概率论中&#xff0c;KL散度&#xff08;Kullback-Leibler Divergence&#xff09;是衡量两个概率分布之间差异的重要工具。本文将从 KL 散度的定义入手&#xff0c;详细解析其公式来源以及如何将其改写为一个可用于优化的形式。 1. 什…...

Java代码操作Zookeeper(使用 Apache Curator 库)

1. Zookeeper原生客户端库存在的缺点 复杂性高&#xff1a;原生客户端库提供了底层的 API&#xff0c;需要开发者手动处理很多细节&#xff0c;如连接管理、会话管理、异常处理等。这增加了开发的复杂性&#xff0c;容易出错。连接管理繁琐&#xff1a;使用原生客户端库时&…...

【Linux】Make/Makefile

这个3/4行的语法和1/2行是一样的。也是依赖关系和依赖方法。 make命令扫描makefile文件时&#xff0c;从上向下扫描&#xff0c;默认形成一个目标文件。 指定make clean的时候才回去执行对应的清除。 为什么要给我们的clean.PHONY:clean声明它是伪目标呢&#xff1f; PHONY类…...

C++练级计划->《多态》虚函数表,菱形继承多态

目录 什么是多态&#xff1f; 多态的条件 虚函数&#xff1a; 虚函数的重写&#xff1a; 协变 析构函数的重写 C11 final 和 override final&#xff1a; override&#xff1a; 总结&#xff1a; 三重对比&#xff1a;重载重写重定义对比 抽象类 多态的原理 虚函数…...

OkHttp3 - 2. OkHttp的核心组件与架构

1 OkHttp的工作原理 OkHttp3 的核心设计遵循以下原则&#xff1a; 请求与响应的分离&#xff1a;通过 Request 和 Response 对象解耦请求构建与结果处理。异步与同步支持&#xff1a;使用 Call 对象管理请求&#xff0c;可以同步或异步执行。高效连接复用&#xff1a;通过连接…...

异或操作解决一些问题

前提&#xff1a; 异或操作符合交换律&#xff0c;结合律&#xff08;因为其根本上来抽象理解&#xff0c;就是查看所有项二进制数相同位是否有奇数个1&#xff0c;对运算结果二进制数而言&#xff0c;没有该位为0&#xff0c;有该位为1&#xff0c;与顺序无关&#xff09;。 …...

操作系统之输入输出

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

Centos 安装 Node.js 和 npm

方法2&#xff1a;使用 NVM&#xff08;Node Version Manager&#xff09;安装 安装 NVM curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash 重新加载配置 source ~/.bashrc 安装最新的 LTS 版本的 Node.js nvm install --lts 验证安装…...

C语言——指针初阶(一)

目录 一.什么是指针&#xff1f;&#xff1f;&#xff1f; 指针是什么&#xff1f; 指针变量&#xff1a; 总结&#xff1a; 总结&#xff1a; 二.指针和指针类型 指针-整数&#xff1a; 总结&#xff1a; 指针的解引用 总结&#xff1a; 三.野指针 如何规避野指针 往期…...

React Native 原生开发指南

写在前面 React Native (RN) 是一个用于构建跨平台移动应用的框架。它允许开发者使用 JavaScript 和 React 来编写应用程序&#xff0c;并将其转换为原生代码。虽然 RN 提供了许多内置的组件和 API&#xff0c;但有时候你可能需要访问原生平台的特定功能或性能优化。为此&…...

【前端】JavaScript中的柯里化(Currying)详解及实现

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;什么是柯里化&#xff1f;&#x1f4af;柯里化的特点&#x1f4af;柯里化的简单示例&#x1f4af;通用的柯里化实现&#x1f4af;柯里化让代码更易读的原因&#x1f4af…...

解决 docker 部署 vsftpd 速度慢问题

解决 docker 部署 vsftpd 速度慢问题 Docker 部署 ftp version: 3.8services:ftps:image: fauria/vsftpdcontainer_name: my-ftpsenvironment:- FTP_USERyourusername- FTP_PASSyourpassword- PASV_ADDRESS192.168.0.123 # 使用环境变量或直接指定IP地址- PASV_MIN_PORT4900…...

Java基础夯实——2.9 多线程如何共享数据

在 Java 多线程编程中&#xff0c;共享数据通过以下几种方式实现&#xff1a; 1. 使用共享对象 多个线程可以通过引用同一个对象来实现数据共享。例如&#xff1a; class SharedData {private int count;public synchronized void increment() {count;}public synchronized …...

【Leetcode Top 100】234. 回文链表

问题背景 给你一个单链表的头节点 h e a d head head&#xff0c;请你判断该链表是否为 回文链表&#xff08;回文 序列是向前和向后读都相同的序列&#xff09;。如果是&#xff0c;返回 t r u e true true&#xff1b;否则&#xff0c;返回 f a l s e false false。 数据…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...