【C++】YY带你手把手掌握C++系列 (P2)未完结

前言

   大家好,这里是YY带你手把手掌握C++系列大部分知识点都含有【特性介绍】【使用场景】【注意要点】【易混淆点】【代码演示】【画图演示由于C++体系之庞大,所以该系列以分P形式更新!本篇博客为P2

  大家可以通过本篇博客查找C++相关知识点使用场景。欢迎大家收藏,以备以后使用。希望能帮助到大家!

   欢迎大家点赞评论,留下您的宝贵意见!对作者而言是莫大的激励!谢谢大家!

 本P即P2的主要知识点有:C/C++的内存管理】【】【】【】【】【】【】【】【】【】【】【】【】【】持续更新中

P1的主要知识点有:缺省函数】【命名空间域】【函数重载】【引用】【C++中的NULL与空指针区别】【内联函数】【】【This指针】【const成员/成员函数】【static静态成员 】【explicit关键字】【友元】【内部类】【匿名对象(即临时对象)】【初始化列表】【类的六个默认成员函数如有需要可以前往YY的带你手把手掌握C++系列(P1)查看!

另有C语言专栏:涵盖C语言基础与拓展知识,欢迎大家前往阅读!订阅!

 【1】指针【2】数组【3】操作符4】动态内存管理【5】内存函数大全【6】文件操作函数

【7】程序的编译链接预处理详解【8】数据在内存中的处理

目录

一.C/C++的内存管理

1.C/C++的内存分布规则

一.易错点:数组存储字符串和指针指向字符串,解引用后所在的位置不同(含例题)

2.C/C++的内存管理方式


一.C/C++的内存管理


1.C/C++的内存分布规则

  1. 又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。
  2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口 创建共享共享内存,做进程间通信。(Linux课程如果没学到这块,现在只需要了解一下)
  3. 用于程序运行时动态内存分配,堆是可以上增长的。
  4. 数据段--存储全局数据和静态数据。
  5. 代码段--可执行的代码/只读常量。

图示: 


一.易错点:数组存储字符串和指针指向字符串,解引用后所在的位置不同(含例题)

  • *char2数组所在的位置是栈,是位于代码段(常量区)"abcd\0"的一份拷贝;
  • pChar3是一个指向代码段(常量区)"abcd\0"的一个指针变量,由于其具有常性,所以要加上const;

图示:


2.C/C++的内存管理方式

PS:C的内存管理有malloc/calloc/realloc/free(可见博主C专栏:动态内存管理)  

引入:C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过newdelete操作符进行动态内存管理。一般C与C++内存管理不混用)


一.使用new和delete操作符的使用规范

注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用 new[]和delete[],要匹配起来使用(如果new后接free,无论是否是对同一块空间的操作,都容易报错)

代码演示:

//报错
int* p3 = (int*)malloc(sizeof(int)); // C
int* p4 = new int;
free(p4);           对开辟同一块空间操作,不匹配
delete p3;

//报错
int* p3 = (int*)malloc(sizeof(int)); // C
int* p4 = new int;
free(p3);           对开辟不同一块空间操作,不匹配
delete p4;

二.new和delete对内置类型的具体使用场景

使用场景:

  • 申请一个int类型空间(默认为0)
  • 申请一个int类型空间,并初始化为10
  • 申请10个int类型空间
  • 申请10个int类型空间,并分别初始化

代码演示:

void Test()
{
  // 动态申请一个int类型的空间
  int* ptr4 = new int;
  
  // 动态申请一个int类型的空间并初始化为10
  int* ptr5 = new int(10);
  
  // 动态申请10个int类型的空间
  int* ptr6 = new int[10];

  // 动态申请10个int类型的空间,并初始化
  int* ptr7 = new int[10]{1,3,4};
  delete ptr4;
  delete ptr5;
  delete[] ptr6;
}


三.new和delete对自定义类型的具体使用场景

使用场景:有一个自定义类型A,他的初始化列表需要传入两个参数

  • 申请一个空间给A(默认为0)
  • 申请一个4个空间给4个A,分别初始化

代码演示:

void test()
{

  A* p1 = new A(1,1);
  delete p2;

  //错误写法:不完全初始化  A* p2 = new A[4]{ A(1,1),A(2,2),A(3,3)};
  A* p2 = new A[4]{ A(1,1),A(2,2),A(3,3),A(4,4) };
  delete[] p2;
}


四.new/delete与malloc/free的底层区别(自定义类型演示)

new/delete 和 malloc/free根本区别: 

  • new的底层其实也是malloc与malloc不同之处在于他会调用拷贝构造
  • delete的底层其实也是free与free不同之处在于他会调用析构函数

实例分析:(顺序)

  • 在下图中,new了一个栈Stack,其实底层是malloc个空间给Stack(自定义类型)调用它的拷贝构造(_array指向的新空间)
  • 当delete栈Stack时,调用析构函数(free掉刚刚_array指向的新空间再free掉Stack所处的空间;
  • PS:如果不是这样,而是先free掉Stack的空间,那么_array指向的新空间将无法被p1找到,造成内存泄漏

图演示: 


 五. new/delete与malloc/free在使用失败时的区别

C++是一门面向对象的语言,处理失败时,不喜欢用返回值,更喜欢用抛异常

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【鲁棒优化、机会约束】具有分布鲁棒联合机会约束的能源和储备调度研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

项目实现读写分离操作(mysql)

读写分离 1.问题说明 2.读写分离 Master(主库)----(数据同步)—> Slave(从库) Mysql主从复制 mysql主从复制 介绍 mysql主从复制是一个异步的复制过程,底层是基于mysql数据库自带的二进制日志功能。就是一台或多台…

算法套路十七——买卖股票问题:状态机 DP

算法套路十七——买卖股票问题:状态机 DP 状态机DP是一种将动态规划方法应用于有限状态机(Finite State Machine)的问题求解方法。 状态机DP(State Machine DP)是一种动态规划的思想,它通常用于解决一些具…

如何应用金字塔模型提高结构化表达能力

看一下结构化表达的定义: 结构化表达:是基于结构化思维,理清事物整理与部分之间关系、换位思考后,进行简洁、清晰和有信服力的表达,是一种让受众听得明白、记得清楚、产生认同的精益沟通方式。 结构化表达的基本原则是…

总结如何申请注册 GitHub 教师教育优惠 Benefits for Teachers 来免费使用 copilot

目录 1. GitHub 教师教育优惠有什么2. 如何申请教师教育优惠呢2.1 选择学校2.2 更改个人信息2.3 准备证明材料2.4 提交申请2.5 遇到的问题2.5.1 问题 12.5.2 问题 22.5.3 问题 3 3. 申请免费的 GitHub Copilot 学生注册不在此处赘述了,网上有很多教程可以参考。但是…

前端BFC

一、首先我们要先了解常见的定位方案,总共3种(普通流、浮动、绝对定位) 而BFC是属于普通流的 我们可以把BFC看作为页面的一块渲染区域,他有着自己的渲染规则 简单来说BFC可以看作元素的一种属性,当元素拥有了BFC属性…

Python os模块详解

1. 简介 os就是“operating system”的缩写,顾名思义,os模块提供的就是各种 Python 程序与操作系统进行交互的接口。通过使用os模块,一方面可以方便地与操作系统进行交互,另一方面页也可以极大增强代码的可移植性。如果该模块中相…

二叉堆讲解

二叉堆讲解 大顶堆和小顶堆 从二叉堆的结构说起,它是一棵二叉树,并且是完全二叉树,每个结点中存有一个元素(或者说,有个权值)。 堆性质:父亲的权值不小于儿子的权值(大根堆&#x…

什么是JS事件流

什么是JS事件流? 一&#xff1a;事件冒泡 <!DOCTYPE html> <html lang"en"> <head><title>事件冒泡例子</title> </head> <body><div id"box">点击我</div> </body> </html>上述的代…

利用暴力攻击破解登陆密码

长久以来&#xff0c;入侵远程计算机系统的工具和技术并没有发生翻天覆地的变化。例如&#xff0c;在许多情况下&#xff0c;普通用户只要知道了相关密码&#xff0c;就能立刻变身为管理员。虽然这些情形听起来不够曲折&#xff0c;但在大多数情况下&#xff0c;暴力攻击是通过…

css3 flex弹性布局详解

css3 flex弹性布局详解 一、flexbox弹性盒子 2009年&#xff0c;W3C 提出了一种新的方案----Flex 布局&#xff0c;可以简便、完整、响应式地实现各种页面布局。目前&#xff0c;它已经得到了所有浏览器的支持&#xff0c;这意味着&#xff0c;现在就能很安全地使用这项功能。…

【一起啃书】《机器学习》第五章 神经网络

文章目录 第五章 神经网络5.1 神经元模型5.2 感知机与多层网络5.3 误差逆传播算法5.4 全局最小与局部极小5.5 其他常见神经网络5.6 深度学习 第五章 神经网络 5.1 神经元模型 神经网络是由具有适应性简单单元组成的广泛并行互连的网络&#xff0c;它的组织能够模拟生物神经系统…

生产流程图怎么制作?思路提供

生产流程图是一种图表&#xff0c;用来展示生产流程中的各个环节及其顺序。这种图表可以帮助企业管理者更好地了解生产过程中的各个环节&#xff0c;从而更好地进行管理和优化。生产流程图通常包括各个生产环节的名称、所需时间、参与人员、设备和工具等信息。 在制作生产流程图…

七大软件架构设计原则详解

目录 1、概述 2、七大设计原则 2.1、开闭原则 2.2、里氏替换原则 2.3、依赖倒置原则 2.4、单一职责原则 2.5、接口隔离原则 2.6、迪米特法则 2.7、合成复用原则 3、最后 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&…

基于jdk1.8的Java服务监控和性能调优

JVM的参数类型 X参数 非标准参数-Xint: 解释执行-Xcomp: 第一次使用就编译成本地代码-Xmixed: JVM自己来决定是否编译成本地代码 默认使用的是mixed mode 用的不多, 只需要做了解, 用的比较多的是XX参数 XX参数 非标准化参数相对不稳定主要用来JVM调优和Debug Boolean: …

【Vue3+TS项目】硅谷甄选day02--后台管理系统模板搭建/项目配置

1 项目初始化 一个项目要有统一的规范&#xff0c;需要使用eslintstylelintprettier来对我们的代码质量做检测和修复&#xff0c;需要使用husky来做commit拦截&#xff0c;需要使用commitlint来统一提交规范&#xff0c;需要使用preinstall来统一包管理工具。 1.1 环境准备 n…

阿里云u1服务器通用算力型CPU处理器性能测评

阿里云服务器u1通用算力型Universal实例高性价比&#xff0c;CPU采用Intel(R) Xeon(R) Platinum&#xff0c;主频是2.5 GHz&#xff0c;云服务器U1实例的基准vCPU算力与5代企业级实例持平&#xff0c;最高vCPU算力与6代企业级实例持平&#xff0c;提供2c-32c规格和1:1/2/4/8丰富…

elasticsearch结构化查询(一)

在上一篇中我们介绍了DSL相关的知识&#xff0c;接下来我们将会学习elasticsearch的结构化查询&#xff0c;同时也实践一下上一篇的DSL的查询用法 什么是结构化搜索? 从《Elasticsearch权威指南》上摘取部分解释如下: 结构化搜索是指查询包含内部结构的数据。日期&#xff0…

MATLAB 之 函数文件、特殊形式的函数和程序调试与优化

文章目录 一、函数文件1. 函数文件的基本结构2. 函数调用2.1 函数调用的格式2.2 函数的递归调用2.3 函数参数的可调性2.4 全局变量与局部变量 二、特殊形式的函数1. 子函数2. 内联函数3. 匿名函数 三、程序调试与优化1. 程序调试方法1.1 利用调试函数进行程序测试1.2 利用调试工…

MySQL数据库,JDBC连接数据库操作流程详细介绍

前言&#xff1a; 在学完 MySQL 和 Java 后&#xff0c;我们通常会尝试使用 Java编译器 连接 MySQL数据库&#xff0c;从而达到使用编译器来操作数据库的效果。连接的这个过程会用 JDBC 相关知识&#xff0c;因此我把 JDBC 包的下载及导入流程&#xff0c;以及 JDBC 的使用流程…