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

news2024/11/10 17:08:45

前言

   大家好,这里是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++是一门面向对象的语言,处理失败时,不喜欢用返回值,更喜欢用抛异常

 

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

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

相关文章

【jmeter】同一线程组下多个请求分别执行不同次数

今天介绍下JMeter如何控制请求执行次数 主要有两种方式: 方式一:通过循环控制器控制每个请求的执行次数 例如:脚本执行规律是这样的,login-->customerPage-->search 我想执行一遍login,然后运行3遍customerP…

智能的本质人工智能与机器人领域的64个大问题阅读笔记(3)

目录 哥德尔不完备定理是什么? 文件重命名的快捷键 第一个质疑这类言论的哲学家是休伯特德雷福斯 (HubertDreyfus),他在《Alchemy and Artifcial Intelligence》(1965)一书中写道:“人工智能的长足发展......必须有待于全新计算机的问世。现有的计算机…

数据结构-算法时间复杂度

1.算法的时间复杂度取决于一段程序中基本运算的频度 2.基础规则 1.加法:O(n) O(max(F(n),G(n)) 2.乘法:O(n) O(F(n)*G(n)) 3.取基本运算中n增长最快的项:F(n) anbncn 时间复杂度为O(n) 3. 例子 接下来举几个例子…

chatgpt与其他行业的结合

chatgpt的应用场景非常广泛,其中一些主要应用场景包括以下几个方面: 1. 自然语言处理:chatgpt作为一种强大的机器学习算法,在自然语言处理领域得到了广泛应用。例如,它可以用来完成机器翻译、情感分析、文本分类等任务…

C语言的标准演变及编程机制

目录 C语言的标准 K&R C C89 C90 C99 C11 C18 C2x C语言的编程机制 示例 1.预处理(Preprocessing) 2.编译(Compilation) 3.汇编(Assemble) 4.链接(Linking) 结语 参考文献 C语言的标准 c语言标准的发展主要分为以下几个阶段: K&R C 1978…

【C++】类的属性和行为

欢迎来到博主 Apeiron 的博客,祝您旅程愉快 !时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、封装 3、总结 1、缘起 C 面向对象的三大特性为:封装,继承和多态。C 认为 万事万物皆为对象&a…

刷题day66:最后一块石头的重量II

题意描述&#xff1a; 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果如下&a…

SRM系统是什么?有什么作用?企业如何应用SRM系统?

一、什么是SRM系统 到底什么是SRM系统&#xff1f; SRM&#xff1a;Supplier Relationship Management&#xff0c;供应商关系管理。 SRM是一种致力于实现与供应商建立和维持长久、紧密伙伴关系的管理思想和软件技术的解决方案&#xff0c;实现从采购需求的下达、审批、招标以…

SpringBoot定时任务里的多线程

SpringBoot定时任务里的多线程 提示前言遇到的问题验证与解决验证单线程执行单任务分析代码及结果 单线程执行多任务 解决实现单任务的多线程为每个任务创建一个子线程 解决多任务的多线程设定固定容量线程池动态设定容量线程池固定线程池和动态线程池的选择 简单总结借鉴及引用…

基于卷积的图像分类识别(三):VGGNet

系列文章目录 本专栏介绍基于深度学习进行图像识别的经典和前沿模型&#xff0c;将持续更新&#xff0c;包括不仅限于&#xff1a;AlexNet&#xff0c; ZFNet&#xff0c;VGG&#xff0c;GoogLeNet&#xff0c;ResNet&#xff0c;DenseNet&#xff0c;SENet&#xff0c;Mobile…

分布式锁解决方案_Redis实现的分布式锁原理

获取锁 互斥&#xff1a;确保只有一个线程获得锁 添加锁 利用setnx的互斥性 启动Redis的我们进行测试看看怎么能某个数据来获得锁 setnx命令表示上锁只要是aa被创建出来我们不删除aa或者设定时间自动删除&#xff0c;那么这把锁就不能被释放开 释放锁 手动释放锁 如果我们…

Ubuntu20.04安装VTK8.2

Ubuntu20.04安装VTK8.2 相关依赖的安装安装步骤参考文献相关依赖的安装 sudo apt install checkinstall sudo apt-get install cmake-curses-gui sudo apt-get install freeglut3-dev sudo apt install libqt5x11extras5-dev sudo apt install cmake-qt-gui安装步骤 1、从官网…

【运筹优化】元启发式算法详解:禁忌搜索算法(Tabu Search,TS)+ 案例讲解代码实战

文章目录 一、介绍二、The Classical Vehicle Routing Problem 经典的车辆路径问题三、基本概念3.1 历史背景3.2 禁忌搜索3.3 搜索空间和邻域结构3.4 Tabus 禁忌3.5 解禁准则3.6 简单禁忌搜索的模板3.7 终止标准3.8 概率TS和候选列表 四、中级概念4.1 搜索强化4.2 多样化4.3 允…

Maven基础使用

Maven 学习目标 理解Maven的用途掌握Maven的基本操作掌握Maven如何创建Web项目 Maven是什么 面临问题 在学习Maven之前&#xff0c;我们先来看一下我们现在做的项目都有哪些问题。假设你现在做了一个crm的系统&#xff0c;项目中肯定要用到一些jar包&#xff0c;比如说myb…

opencv_c++学习(九)

一、图像二值化 固定阈值二值化 threshold ( lnputArray src, outputArray dst,double thresh, double maxvall, int typesrc:待二值化的图像&#xff0c;图像只能是CV_8U和CV_32F两种数据类型。对于图像通道数目的要求和选择的二值化方法相关。 dst:二值化后的图像&#xff…

【数据结构】哈希表上——开放寻址法

文章目录 前言映射哈希冲突开放寻址法思路分析结构分析函数实现插入删除寻找 结语 前言 大家好久不见&#xff0c;今天来讲解一下哈希表的基本原理并使用开放寻址法实现简单哈希表。 映射 哈希表的实现思路就是将一组数据映射成另外一组可以直接查找的数据&#xff0c;假如有…

【LeetCode】每日一题:链表部分经典题型

文章目录 1.反转链表2.链表的中间节点3.合并两个有序链表4.相交链表5.环形链表6.环形链表Ⅱ ​&#x1f47b;内容专栏&#xff1a;《LeetCode刷题专栏》 &#x1f428;本文概括&#xff1a;归纳链表部分经典题型。206.反转链表、876.链表的中间节点、21.合并两个有序链表、160.…

如何优雅地彻底解决 antd 全局样式问题

背景 由于某些原因&#xff0c;我们团队负责在组件 上做二次开发&#xff0c;简单理解就是封装组件&#xff0c;组件库选择了 antd&#xff0c;尴尬的是引入之后发现&#xff0c;父组件 自身是带一套全局样式的&#xff0c;而 子组件antd 又带了一套全局样式&#xff0c;导致 子…

字节原来这么容易进,是面试官放水,还是公司实在是太缺人?

本人211非科班&#xff0c;之前在字节和腾讯实习过&#xff0c;这次其实没抱着什么特别大的希望投递&#xff0c;没想到字节可以再给我一次机会&#xff0c;还是挺开心的。 本来以为有个机会就不错啦&#xff01;没想到能成功上岸&#xff0c;在这里要特别感谢帮我内推的同学&…