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

C++ Primer阅读笔记--动态内存和智能指针

​​​​​​​

目录

1--动态内存管理

2--shared_ptr类

2-1--make_shared 函数

2-2--引用计数

2-3--get

3--new和delete

4--shared_ptr和new结合使用

5--unique_ptr

6--weak_ptr


1--动态内存管理

new:在动态内存中为对象分配空间并返回一个指向该对象的指针;

delete:接受一个动态对象的指针,销毁该对象并释放与之关联的内存;

C++11新标准两类智能指针(负责自动释放所指向的对象):

        ① shared_ptr:允许多个指针指向同一个对象;

        ② unique_ptr:指针独占所指向的对象;

        ③ weak_ptr:指向 shared_ptr 所管理的对象,是一种若引用(不会递增引用计数);

2--shared_ptr类

2-1--make_shared 函数

        make_shared 函数在动态内存中分配一个对象并进行初始化,返回指向该此对象的shared_ptr

        使用 make_shared 必须显式指定对象的类型

std::shared_ptr<int> p = std::make_shared<int>(42);

2-2--引用计数

        每个 shared_ptr 都有一个关联的计数器,其称为引用计数,当拷贝一个 shared_ptr 时,计数器会递增;(当用一个 shared_ptr 初始化另一个 shared_ptr,或者将其作为参数进行传递以及作为函数的返回值时,都会使关联的计数器递增;当给 shared_ptr 赋予一个新值或是 shared_ptr 被销毁(即离开局部作用域)时,计数器会递减);

        当一个 shared_ptr 的计数器为 0 时,会自动释放管理的对象;

2-3--get

        get 函数返回一个内置指针,指向智能指针管理的对象,get 用来将指针的访问权限传递给代码,只有确定代码不会 delete 指针的情况下才能使用 get。

std::shared_ptr<int> p(new int(42));
int *q = p.get();
{std::shared_ptr<int>(q);
}// 程序块结束,q被销毁
int foo = *p; // 未定义,p指向的内存已经被释放;

3--new和delete

        new 无法为其分配的对象命名,只返回一个指向该对象的指针;

        默认情况下,动态分配的对象是默认初始化的(没有默认构造函数的内置类型将是未定义的);

        对动态分配的对象进行值初始化,只需在类型名后跟一对空括号即可;

int *pi1 = new int; // 默认初始化,*pi1的值未被定义
int *pi2 = new int(); // 值初始化,*pi2的值为0

        delete 销毁给定指针所指向的对象,并释放对应的内存;

        当 delete 一个指针后,指针变为空悬指针(指向一块曾经保存数据对象但已无效的内存的指针);对 delete 后的指针赋予 nullptr ,表明指针不指向任何对象,避免空悬指针的相关问题;

int *p(new int(42)); // p 指向动态内存
auto q = p; // p和q指向相同的内存
delete p; // p和q均变为无效
p = nullptr; // 指出 p 不再指向任何对象

4--shared_ptr和new结合使用

        可以使用 new 返回的指针来初始化智能指针,接受指针参数的智能指针构造函数是 explicit 的,即必须使用直接初始化形式来初始化智能指针,不能通过内置指针隐式转换为一个智能指针;

std::shared_ptr<int> p1 = new int(1024); // 错误
std::shared_ptr<int> p2(new int(1024)); // 正确// 错误
std::shared_ptr<int> clone(int p){return new int(p); 
}// 正确
std::shared_ptr clone(int p){return std::shared_ptr<int>(new int(p));
}

5--unique_ptr

        不同于 shared_ptr,某个时刻只能有一个 unique_ptr 指向一个给定的对象;

        定义 unique_str 时需要将其绑定到一个 new 返回的指针上,初始化 unique_ptr 必须采用直接初始化形式;

std::unique_ptr<int> p(new int(42));

        由于 unique_str 拥有它指向的对象,因此 unique_ptr 不支持普通的拷贝或赋值操作;

        不能拷贝或赋值 unique_ptr,但可以通过调用 release 或 reset 将指针的所有权从一个unique_ptr 转移到另一个 unique_ptr;        

// 所有权从 p1 转移给 p2,release 将p1置为空
std::unique_ptr<std::string> p2(p1.release());std::unique_ptr<std::string> p3(new std::string("xxxxx"));
p2.reset(p3.release()); // p2释放原来指向的内存,所有权从p3转移给p2

6--weak_ptr

        weak_ptr 指向由一个 shared_ptr 管理的对象,将一个 weak_ptr 绑定到一个 shared_ptr 不会改变 shared_ptr 的引用计数;一旦 shared_ptr 的引用计数为0,weak_ptr也会相应自动释放;

        使用 weak_ptr 访问对象前,必须调用 lock 判断对象是否存在;如果对象存在,lock 返回一个指向共享对象的 shared_ptr;

auto p = std::make_shared<int>(42);
std::weak_ptr<int> wp(p); // wp若共享p,p的引用计数未改变
if(std::shared_ptr<int> np = wp.lock()){.... // np 与 p 共享对象
}

相关文章:

C++ Primer阅读笔记--动态内存和智能指针

​​​​​​​ 目录 1--动态内存管理 2--shared_ptr类 2-1--make_shared 函数 2-2--引用计数 2-3--get 3--new和delete 4--shared_ptr和new结合使用 5--unique_ptr 6--weak_ptr 1--动态内存管理 new&#xff1a;在动态内存中为对象分配空间并返回一个指向该对象的指…...

git分支管理策略

git的基础操作以及常用命令在上篇博客哦~ git原理与基本使用 1.分支管理 1.主分支 在版本回退⾥&#xff0c;我们已经知道&#xff0c;每次提交&#xff0c;Git都把它们串成⼀条时间线&#xff0c;这条时间线就可以理解为是⼀个分⽀。截⽌到⽬前&#xff0c;只有⼀条时间线&…...

IntelliJ IDEA maven配置,设置pom.xml的配置文件

IntelliJ IDEA项目&#xff0c;选择 文件 设置&#xff0c;弹窗 构建、执行、部署 构建工具 Maven就可以 maven配置好以后&#xff0c;在pom.xml的配置文件中就可以设置对应的jar包了&#xff0c;这样构建的时候自动需要的jar&#xff0c;在项目中导入即 settings.xml文件apa…...

C#__使用Thread启动线程和传输数据

class Program{static void Test(){Console.WriteLine("Start……");Thread.Sleep(2000); // 1s等于1000ms&#xff0c;暂停2sConsole.WriteLine("end");}static void Download(Object ob){string str ob as string; // 遍历传递过来的ob字符串Console.Wr…...

appium2.0+ 单点触控和多点触控新的解决方案

在 appium2.0 之前&#xff0c;在移动端设备上的触屏操作&#xff0c;单手指触屏和多手指触屏分别是由 TouchAction 类&#xff0c;Multiaction 类实现的。 在 appium2.0 之后&#xff0c;这 2 个方法将会被舍弃。 "[Deprecated] TouchAction action is deprecated. Ple…...

记录一次Modbus通信的置位错误

老套路&#xff0c;一图胜千言&#xff0c;框图可能有点随意&#xff0c;后面我会解释 先描述下背景&#xff0c;在Modbus线程内有一个死循环&#xff0c;一直在读8个线圈的状态&#xff0c;该线程内读到的消息会直接发送给UI线程&#xff0c;UI线程会解析Modbus数据帧&#xf…...

数据结构--递归与分治

汉诺塔分析&#xff1a; 以三层进行分析&#xff0c;大于三层分析情况是一样的。 #include <stdio.h>void move(int n,char x,char y,char z) {if(1 n){printf("%c---------->%c\n",x,z);}else{move(n-1,x,z,y);//将第n-1个盘子从x借助z移动到y printf(&q…...

spring cloud gateway中出现503

spring cloud gateway中出现503 当搭建网关模块的时候出现503的错误的最大的可能就是没有设置负载均衡的依赖包 原先搭建的时候采用的是下面的方式进行设置的 gateway:discovery:locator:enabled: true #可以从nacos进行服务的发现 上面的这种方式可以直接进行注册和发现&…...

战略在集体学习过程中涌现

战略学习派&#xff1a;战略是涌现的学习过程&#xff0c;中国人的话&#xff0c;要交学习费&#xff01;【安志强趣讲269期】 趣讲大白话&#xff1a;出来混总要交学费 **************************** 中国人有这个意识 新进一个领域&#xff0c;要交学费&#xff0c;有学习过程…...

html动态爱心代码【四】(附源码)

目录 前言 特效 完整代码 总结 前言 情人节马上就要到了&#xff0c;为了帮助大家高效表白&#xff0c;下面再给大家带来了实用的HTML浪漫表白代码(附源码)背景音乐&#xff0c;可用于520&#xff0c;情人节&#xff0c;生日&#xff0c;表白等场景&#xff0c;可直接使用。…...

如何利用SLF4J扩展模块实现高效的日志记录

如何利用SLF4J扩展模块实现高效的日志记录 摘要&#xff1a;SLF4J&#xff08;Simple Logging Facade for Java&#xff09;是一个用于 Java 程序中记录日志的简单门面&#xff0c;它提供了一种统一的日志记录接口&#xff0c;可以方便地切换底层的日志实现。SLF4J 还…...

通用语言模型蒸馏-GLMD

文章目录 GLMD一、PPT内容论文背景P1 BackgroundP2 Approach 相关知识P3 知识蒸馏P4 语言建模词预测逻辑 方法P5 两阶段词汇预测蒸馏P6P7 词汇压缩 实验结果P8 results 二、论文泛读2.1 论文要解决什么问题&#xff1f;2.2 论文采用了什么方法&#xff1f;2.4 论文达到什么效果…...

kafka--技术文档-基本概念-《快速了解kafka》

学习一种新的消息中间键&#xff0c;卡夫卡&#xff01;&#xff01;&#xff01; 官网网址 Apache Kafka 基本概念 Kafka是一种开源的分布式流处理平台&#xff0c;由Apache软件基金会开发&#xff0c;用Scala和Java编写。它是一个高吞吐量的分布式发布订阅消息系统&#xf…...

ChatGPT:ChatGPT 的发展史,ChatGPT 优缺点以及ChatGPT 在未来生活中的发展趋势和应用

目录 1.ChatGPT 是什么 2. ChatGPT 的发展史 3.ChatGPT 优缺点 4.ChatGPT 在未来生活中的发展趋势和应用 5.ChatGPT经历了几个版本 1.ChatGPT 是什么 ChatGPT 是一个在线聊天机器人&#xff0c;可以与使用者进行语义对话和提供帮助。它可以回答各种问题&#xff0c;提供建议…...

【八股】2023秋招八股复习笔记4(MySQL Redis等)

文章目录 目录1、MySQLmysql索引实现mysql索引优化mysql索引失效的情况mysql 千万数据优化mysql 事务隔离级别 & 实现原理mysql MVCC版本链&#xff08;undo log&#xff09;mysql数据同步机制 & 主从复制 &#xff08;binlog&#xff09;mysql 日志&数据恢复&…...

【Unity】 Mesh 和 Mesh.subMeshCount

原文 https://www.cnblogs.com/hwx0000/p/12733582.html 什么是subMesh Mesh里面有这么一个参数mesh.subMeshCount&#xff0c;所以说明了subMesh是 属于 Mesh的&#xff0c;subMesh是mesh的子mesh&#xff0c;subMesh所有的顶点数据信息都来自于对应的Mesh&#xff0c;subMes…...

Java开发中Word转PDF

Java开发中Word转PDF文件5种方案横向评测 https://blog.csdn.net/aley/article/details/127914145?ops_request_misc&request_id&biz_id102&utm_termjava%20%20word%20%E8%BD%ACpdf&utm_mediumdistribute.pc_search_result.none-task-blog-2allsobaiduweb~de…...

【前端】vscode前端插件笔记

前段vscode好用插件笔记 不需要安装已经自带 HTML SnippetsPath IntellisenseAuto Rename TagBracket Pair Colorizer 核心好用 中文包关键步骤&#xff1a;controlshift然后display language切换即可open in browserLive Server 实时效果显示JS-CSS-HTML Formatter保存后格…...

windows MFC消息demo

1、在BEGIN_MESSAGE_MAP添加MAP映射 BEGIN_MESSAGE_MAP(CdesktopTotalMapDlg, CDialogEx)ON_MESSAGE(WM_SYS_NORMAL_MSG, OnSysNormalMessage)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_SELECTSOURCEDIR, &CdesktopTotalMapDlg::OnB…...

尚硅谷大数据项目《在线教育之离线数仓》笔记003

视频地址&#xff1a;尚硅谷大数据项目《在线教育之离线数仓》_哔哩哔哩_bilibili 目录 第8章 数仓开发之DIM层 P039 P040 P041 P042 P043 P044 P045 P046 P047 P048 第8章 数仓开发之DIM层 P039 第8章 数仓开发之DIM层 DIM层设计要点&#xff1a; &#xff08;1&a…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...