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

news2024/9/20 22:55:05

文章目录

  • 程序区域内存划分
  • 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不会。

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

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

相关文章

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

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

函数编程之Function

文章目录前言一、Function是什么?二、Function 怎么用?1.简单使用2.真正的强大之处总结前言 在java8之后,我已经习惯了开始用stream()方式编程,但是对于新引入的其他功能,还是不清楚,今天经历了一个编程问题后,让我对于Function() 这个函数有了新的认知; 一、Func…

渲染农场优势是什么_云渲染农场怎么用?

在回答渲染农场的优势这个问题之前,我先申明一下本文中提到的渲染农场/云渲染平台/云渲染农场,都特指CG领域内的专业3D渲染平台,有一些文章会强调这个叫法的区别,但是业内一般都不会分这么细,所以也就不赘述了。渲染农…

【Spark分布式内存计算框架——Spark SQL】7. 数据处理分析案例

4.3 案例:电影评分数据分析 使用电影评分数据进行数据分析,分别使用DSL编程和SQL编程,熟悉数据处理函数及SQL使用,业务需求说明: 对电影评分数据进行统计分析,获取Top10电影(电影评分平均值最高…

4道数学题,求解极狐GitLab CI 流水线|第23题:父子流水线 + 多项目流水线

本文来自: 武让 极狐(GitLab) 高级解决方案架构师 💡 极狐GitLab CI 依靠其一体化、轻量化、声明式、开箱即用的特性,在开发者群体中的使用率越来越高,在国内企业中仅次于 Jenkins ,排在第二位。 极狐GitLab 流水线有…

如何解决错误“已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)“

解决 Microsoft SQL Server 的错误: 1222 使用存储过程 sp_who2设置 LOCK_TIMEOUT在Microsoft SQL Server Management Studio中,有时会在对象资源管理器中查看树、表或过程时收到错误。当查询等待的时间超过锁定超时设置时,通常会发生此错误。锁定超时以毫秒为单位,等待后端…

LeetCode 382. 链表随机节点

原题链接 难度:middle\color{orange}{middle}middle 题目描述 给你一个单链表,随机选择链表的一个节点,并返回相应的节点值。每个节点 被选中的概率一样 。 实现 SolutionSolutionSolution 类: Solution(ListNodehead)Solution…

数据库(第五次作业)

1.1 Redis概述 1.1.1 什么是Redis 2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo便开始对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据…

Amazon S3简介

前言: 这段时间来到了某大数据平台,做平台技术底座封装和一些架构等等,有结构化数据也有非结构数据,涉及到很多技术,自己也私下花时间去研究了很多,有很多纯技术类的还是需要梳理并记录,巩固以及…

保姆级教程:Win10远程连接MACBook、MACBook远程连接Win10。

本篇给大家展示Windows远程连接连接MACBook、MACBook远程连接Windows的方法。需要明确的是,这种通过TCP远程连接的远程很稳定,基本比向日葵等软件流畅很多,但是缺点是需要保证在同一网域下,也就是同一局域网下,部分情况…

中国协同办公的终局是什么?

换言之,工具一体化是基本要求,但基于全链路集成的生态则是因地制宜、于当下的产业探索。 作者|斗斗 编辑|皮爷 出品|产业家 “计划裁员1300人,占到全球员工的15%。”美国东部时间2月7日,Zoom CEO袁征在官网博客发布公开信…

【SpringBoot】分布式日志跟踪—通过MDC实现全链路调用日志跟踪

一.MDC 1.MDC介绍 MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程场景下记录日志的功能。MDC 可以看成是一个与当前线程绑定的Map,可以往其中添加键值对。MDC 中包含的内容可以被同…

Python机器学习入门笔记(2)—— 分类算法

目录 转换器(transformer)和估计器(estimator) K-近邻(K-Nearest Neighbors,简称KNN)算法 模型选择与调优 交叉验证(Cross-validation) GridSearchCV API 朴素贝叶…

UE4 渲染学习笔记(未完)

原文链接:虚幻4渲染管线入门 - 知乎 从原文摘抄一下: 渲染框架 1,一套是传统的以RHICmdList为核心构建RenderPass,从RHICmdList.BeginRenderPass(...)开始,以RHICmdList.EndRenderPass()结束的框架。 2.一套是以新的Gr…

【面向对象语言三大特性之 “继承”】

目录 1.继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6. 继承与静态成员 7.复杂的菱形继承及菱形虚拟…

linux(全志)初始环境到移植lvgl

一、 格式化TF卡 1. linux命令行格式化 1.1 找到U盘位置(已挂载) sudo fdisk -l 如图,我的在/dev/sdb 1.2 格式化U盘 sudo mkfs -t vfat /dev/sdb-t 后面是格式化为哪种文件系统格式,vfat就是fat32格式,最后…

Hashmap链表长度大于8真的会变成红黑树吗?

1、本人博客《HashMap、HashSet底层原理分析》 2、本人博客《若debug时显示的Hashmap没有table、size等元素时,查看第19条》 结论 1、链表长度大于8时(插入第9条时),会触发树化(treeifyBin)方法,但是不一定会树化,若数组大小小于…

Win11电脑速度慢、延迟高怎么办?

作为新版的系统,Windows 11还需要更多的时间完善。不少用户反映升级了Win11后反而感觉速度慢,还有延迟或死机现象。 如果你使用Win11系统时也有这种感觉,那这篇文章就是为你提供的。 问题可能出在系统存储容量低、驱动程序已过时&#xff0…

APP渗透抓包

APP渗透抓包1.APP渗透测试原理2.安装安卓模拟器抓包2.1.安装模拟器2.2.设置代理下载证书2.2.1.burp suite设置代理2.2.2.浏览器设置代理2.2.3.下载证书2.3.模拟器安装证书2.3.1.移动证书2.3.2.证书设置2.4.设置代理2.4.1.设置burp suite代理2.4.2.夜神模拟器代理2.5.抓包测试2.…

JVM调优及垃圾回收GC

一、说一说JVM的内存模型。JVM的运行时内存也叫做JVM堆,从GC的角度可以将JVM分为新生代、老年代和永久代。其中新生代默认占1/3堆内存空间,老年代默认占2/3堆内存空间,永久代占非常少的对内存空间。新生代又分为Eden区、SurvivorFrom区和Surv…