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

【C++修行之路】C/C++内存管理

文章目录

  • 程序区域内存划分
  • C语言动态内存分配:
  • new和delete:
  • new、delete和malloc、free的区别:

程序区域内存划分

C/C++程序内存区域划分非常相似。
在这里插入图片描述


C语言动态内存分配:

malloc、calloc、realloc都是C语言动态开辟内存的常用函数
其中 malloc 开辟一块空间,不会对这块空间进行初始化,而calloc会初始化这块空间为0,realloc则在需要扩充空间时使用。


operator new和operator delete:
new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。

而operator new 和 operator delete 底层依然是调用malloc和free实现的。


new和delete:

对于内置类型
new和malloc,delete和free基本类似,不同的地方是:
new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。

除此之外new可以在申请空间后赋值。

int* p1 = new int;
int* p2 = new int(2);//赋值
int* p3 = new int[3];
int* p4 = new int[3]{1,2,3};//赋值

对于自定义类型

  • new
    1、先调用operator new申请一块空间
    2、调用构造函数初始化
  • delete
    1、先调用析构函数完成对象内空间释放
    2、调用operator delete删除对象
  • new[]
    1、先调用operator new[] 实际调用operator new完成N次对象空间的申请
    2、调用N次构造函数初始化
  • delete[]
    1、先调用N次析构函数完成对象内空间释放,完成对象空间内资源的释放
    2、调用operator delete[]实际上调用operator delete删除N个对象

定位new表达式:

格式:new (指针) type(初始化列表)
type指对象的类型

定位new表达式在实际中一般是配合内存池使用。因为内存池分配出的内存没有初始化,所以如果是自定义类型的对象,需要使用new的定义表达式进行显示调构造函数进行初始化。

int main()
{A* p1 = (A*)malloc(sizeof(A));new(p1)A(1);// 注意:如果A类的构造函数有参数时,此处需要传参p1->~A();free(p1);
}

new、delete和malloc、free的区别:

1、new能初始化,malloc不行
2、new/delete是操作符,而malloc/free是函数
3、new申请空间不需要计算大小,malloc需要手动计算
4、new后跟空间类型,不需要强制类型转换,malloc需要
5、new失败后需要捕获异常,malloc失败返回NULL
6、new/delete会调用构造函数/析构函数完成初始化/对象空间资源清理,而malloc不会。

相关文章:

【C++修行之路】C/C++内存管理

文章目录程序区域内存划分C语言动态内存分配:new和delete:new、delete和malloc、free的区别:程序区域内存划分 C/C程序内存区域划分非常相似。 C语言动态内存分配: malloc、calloc、realloc都是C语言动态开辟内存的常用函数 其中 malloc 开…...

spring cloud alibaba Sentinel(四)

服务雪崩 在分布式系统中,由于网络原因或自身的原因,服务一般无法保证 100% 可用。 如果一个服务出现了问题,调用这个服务就会出现线程阻塞的情况, 此时若有大量的请求涌入,就会出现多条 线程阻塞等待,进而导致服务瘫痪。 由于服…...

Redis第三讲

目录 三、Redis03 3.1 Redis持久化之RDB 3.1.1 什么是RDB 3.1.2 备份是如何执行的 3.1.3 Fork 3.1.4 RDB持久化流程 3.1.5 dump.rdb文件 3.1.6 配置rdb文件生成位置 3.1.7 如何触发RDB快照以及保持策略 3.2 Redis持久化之AOF 3.2.1 什么是AOF 3.2.2 AOF持久化流程 …...

JAVA线程池的使用

一、池化思想和JAVA线程池 池化是很重要的思想;池化的好处是提供缓冲和统一的管理。这个笔者在本人的数据库连接池的博客中已经提到过了(JAVA常用数据库连接池_王者之路001的博客-CSDN博客 )。 线程池是另一种池化思想的运用,把…...

力扣56.合并区间

文章目录力扣56.合并区间题目描述排序合并力扣56.合并区间 题目描述 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中…...

代码随想录二刷Day03链表: 24.两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表||

24.两两交换链表中的节点 文章链接:代码随想录 (programmercarl.com) 思路: (1)首先如果要处理相邻两个节点的话,一定需要操作两个节点的前一个节点才可以,因此,本题需要设定一个虚拟头节点 …...

我应该在我的博客上写什么? 介绍如何撰写初学者容易担心的文章

我想有很多人开了博客,但想不起来写作,无法取得进展。 博客的主题和文章的内容不会仅仅通过写你想做的事情来工作。 重要的是要了解用户想要阅读的内容以及人们可能收集的内容,并将其与您想要编写的内容很好地匹配。 这一次,我…...

嵌入式C语言设计模式 --- 外观模式

1 - 什么是外观模式? 外观模式(Facade Pattern),是一种比较简单的结构型模式,它存在的目的,也是为了简单。 外观模式隐藏了一系列接口的复杂性,旨在为外部客户端提供一个更高层次且统一简单的接口,简化了客户端调用某些模块的一系列操作。 外观模式应该是软件工程师…...

若依ruoyi——手把手教你制作自己的管理系统【三、代码生成】

昨天情人节一( ̄︶ ̄*)) 送给赛利亚一((* ̄3 ̄)╭ ********* 专栏略长 爆肝万字 细节狂魔 请准备好一键三连 ********* 修改后的页面: 干干净净贼舒服一Ψ( ̄∀ ̄)Ψ——Ψ( ̄∀&#x…...

SCI论文写作神器集合 —— 超级实用

特此声明: 本文拷贝多处别人的内容,并给出具体的链接 本文所提到的软件都为博主在文章撰写过程中发掘的比较实用的工具,旨在帮助小伙伴们更快更有效率的完成文章发表,如果其他好用的工具,欢迎各位交流~~ 一、文献搜索神…...

MAC 系统安装多版本 JDK 并任意切换

1、背景 在进行 Java 开发的过程中,我们可能需要使用不同版本的 JDK。例如:一些旧的 Java 应用程序只能在旧版本的 JDK 上运行,而一些新的 Java 应用程序需要较新的 JDK 才能运行。 在 MAC 系统上,如何安装多个版本的 JDK 并配置…...

配置 Smart Link 接口时需注意的互斥命令

配置 Smart Link 接口时需注意的互斥命令 一、接口加入Smart Link组功能与以下功能互斥一、接口加入Smart Link组功能与以下功能互斥 注:当接口已经加入Smart Link组,则不能再配置以下功能;反之,当接口已经配置以下功能&#xff…...

QT的下载和安装

这里介绍的是QT官方方式下载,每次都让我很糊涂,就记载一下。先是下载QT online installerhttps://www.qt.io/download 在下方有Go Open Sourcehttps://www.qt.io/download-open-source 在下方有Download the Qt Online installerhttps://www.qt.io/downl…...

nacos配置中心与服务注册中心

文章目录 目录 文章目录 前言 一、服务注册与发现中心 二、配置中心 总结 前言 Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是 Spring Cloud Alibaba 组件之一,负责服务注册发现和服务配置. [服务治理的作用和微服务配置管理] Na…...

UE4 手把手教你做插件(1) 从代码引用插件

0,前言 我看的是 技术宅阿棍儿 的视频,B站有。 系列视频:从代码引用插件_哔哩哔哩_bilibili 看不懂,只能边查资料边看,讲的顺序有点乱 1,根据视频提示创建第三方插件 注意:如果只有空白插件的情…...

【Mybatis源码解析】一级缓存和二级缓存源码解析

文章目录缓存使用缓存源码测试代码上一篇《【Mybatis源码解析】mapper实例化及执行流程源码分析》,主要讲解了Mybatis的基本原理一级执行的流程,这一章来讲一下Mybatis的两个缓存:一级缓存和二级缓存。 因为网上大部分都是使用xml配置的方式…...

你知道MES实施的要点吗?

随着国家行动纲领:中国制造2025(智能制造)的发布,MES系统在制造业的工厂中所占比重越来越大,越来越多的工厂选择使用MES完成工厂的信息化、数字化、智能化生产。伴随着企业对MES的需求不断增大,生产MES的厂…...

告诉你为什么为什么 SELECT COUNT(*) FROM table 在 InnoDB 引擎中比 MyISAM引擎中的速度慢

统计一张表的总数量,是我们开发中常有的业务需求,通常情况下,我们都是使用 select count(*) from table SQL 语句来完成。随着业务数据的增加,你会发现这条语句执行的速度越来越慢,为什么它会变慢呢? 为什…...

Redis 命令和Redis key键

Redis 命令 Redis 命令用于在 Redis 服务器上执行一些操作,而命令运行的方式是通过客户端命令行来执行的,这种方式也被称为“命令行模式”。因此想要在 Redis 服务器上运行命令,您首先需要开启一个 Redis 客户端。操作方法如下: …...

如何入侵服务器

根据中华人民共和国刑法: 第二百八十六条违反国家规定,对计算机信息系统功能进行删除、修改、增加、干扰,造成计算机信息系统不能正常运行,后果严重的,处五年以下有期徒刑或者拘役;后果特别严重的&#xff…...

5分钟快速上手:免费高效的B站视频解析终极方案

5分钟快速上手:免费高效的B站视频解析终极方案 【免费下载链接】bilibili-parse bilibili Video API 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse 你是否曾想保存喜欢的B站视频却苦于找不到合适的工具?bilibili-parse作为一款开…...

别再瞎猜了!手把手教你算清FPGA Aurora IP核的用户时钟(附8B/10B编码影响)

别再瞎猜了!手把手教你算清FPGA Aurora IP核的用户时钟(附8B/10B编码影响) 当你在Xilinx Vivado中配置Aurora 8B/10B IP核时,是否曾被USER_CLK的计算问题困扰?这个看似简单的参数背后,其实隐藏着线速率、数…...

终极免费跨平台待办清单:My-TODOs 让您的任务管理回归简单高效

终极免费跨平台待办清单:My-TODOs 让您的任务管理回归简单高效 【免费下载链接】My-TODOs A cross-platform desktop To-Do list. 跨平台桌面待办小工具 项目地址: https://gitcode.com/gh_mirrors/my/My-TODOs 在信息爆炸的时代,我们每天都在处理…...

Blender 3MF插件:终极指南 - 如何轻松实现3D打印设计一体化

Blender 3MF插件:终极指南 - 如何轻松实现3D打印设计一体化 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 你是否曾经在Blender中精心设计了3D模型&#xff…...

自建AI编程助手服务:Recodex部署与Codex API代理实战

1. 项目概述与核心价值最近在折腾AI编程助手,发现OpenAI的Codex模型确实好用,但直接访问官方服务总是不太稳定,速度也时快时慢,对于需要深度集成的开发工作来说,体验不够丝滑。于是,我花了不少时间研究自建…...

Kubernetes Service Mesh进阶:Linkerd实践与对比

Kubernetes Service Mesh进阶:Linkerd实践与对比 一、引言 服务网格(Service Mesh)是云原生架构中用于管理服务间通信的基础设施层。Linkerd作为第二代服务网格,以其轻量、高性能的特点备受关注。本文将深入探讨Linkerd的核心概念、实践部署以及与Istio的…...

FastAPI新手快速入门

一、认识FastAPI1.什么是apiapi接口其实就是应用程序器对外提供操作数据的入口,这个入口可以是函数、方法或者url接口当客户端调用入口,应用程序会执行对应代码操作,完成相对应的功能(应用服务器只负责对外提供统一API&#xff0c…...

保姆级教程:用STM32F103C8T6的ADC读取MPX4250压力传感器数据(附完整代码)

从零开始:STM32F103C8T6驱动MPX4250压力传感器全流程解析 硬件准备与传感器基础 MPX4250作为工业级压力传感器,其核心优势在于宽量程(20-250kPa)和出色的线性输出特性。这款传感器采用硅压阻技术,内部集成了温度补偿…...

K8s网络插件Flannel与Calico:从原理到实战的选型与部署指南

1. Kubernetes网络插件基础认知 刚接触Kubernetes时,最让我头疼的就是容器网络问题。为什么Pod之间需要通信?为什么有的服务跨节点就访问不了?这些问题的答案都藏在CNI(Container Network Interface)插件里。Flannel和…...

PCI、PCIe与InfiniBand接口技术对比与应用解析

1. 计算机接口技术演进背景在服务器和PC硬件架构中,I/O接口技术始终是决定系统性能的关键因素之一。作为从业15年的系统架构师,我见证了从传统PCI总线到现代高速互连技术的完整演进历程。这种演进并非简单的替代关系,而是针对不同应用场景的技…...