【C++】内存分布、new、delete、 operator new、operator delete

内存分布

在C语言和C++中,程序内存被划分成六个部分:

内核空间、栈、内存映射段、堆、数据段、代码段

栈:又称堆栈,主要为非静态局部变量、函数参数、返回值等,栈的生长方向是向下生长

内存映射段:高效的I/O映射方式,用于装载一个共享的动态内存库。用户可以使用系统接口创建共享内存,用做进程间通信

堆:用于程序运行时的动态内存分配,堆的生长方向是向上生长

数据段:储存全局数据和静态数据

代码段:储存可执行的代码、只读常量(const)


new、delete

 new与malloc函数等C语言中开辟空间的操作不同的是,new不需要自行计算空间大小和返回类型,同时在使用new进行自定义类型的空间开辟时,它会自动调用默认构造函数完成初始化

delete与free等不同之处在于:delete会自动调用自定义类型的析构函数

在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与 free不会

申请和释放单个元素的空间,使用newdelete操作符

申请和释放连续的空间,使用 new[]delete[]


 operator new与operator delete

operator new和operator delete为系统定义的全局函数

new和delete在底层分别调用了operator new和operator delete用来申请和释放空间

operator new实际通过malloc来申请空间,当malloc申请成功时直接返回,失败时抛异常

operator delete实际通过free来释放空间,成功时直接返回,失败时返回NULL

new的原理:先用operator new申请空间,在申请的空间上执行构造函数,完成对象的构造

delete的原理:在申请的空间上执行析构函数,完成对象的资源清理,再用operator delete释放空间

new T[N]的原理:先用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请,再在申请的空间上执行N次构造函数

delete[]的原理:先在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理,再调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间


 malloc/free与new/delete的区别

共同点:都是从堆上申请空间,需要用户手动释放空间

不同点:1.malloc与free为函数,new与delete为操作符

2.malloc申请的空间不会初始化,new会初始化

3.malloc申请空间时需要手动计算空间大小并传递,new只需要在后面跟上空间的类型,若是申请多个对象,[]中指定对象个数即可

4.malloc返回值为void*,必须强制类型转化,new不需要

5.malloc申请空间失败时返回的NULL,使用时必须判空,new不需要判空但必须捕获异常

6.申请自定义类型对象时,new/delete会执行默认的构造函数和析构函数,完成对象的初始化或资源释放,而malloc/free不会

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

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

相关文章

代码随想录算法训练营day37|动态规划part5

今天的几道题目都比较简单,思路也比较相似,都是利用完全背包。完全背包和01背包的不同点在于完全背包每个元素可以取多次,而01背包只能取1次,所以在dp一维数组遍历时,完全背包仍然要从前往后遍历,并且无论是…

混合云策略在安全领域受到青睐

Genetec 发布了《2025 年物理安全状况报告》,该报告根据超过 5,600 名该领域领导者(其中包括 100 多名来自澳大利亚和新西兰的领导者)的回应,揭示了物理安全运营的趋势。 报告发现,澳大利亚和新西兰的组织采用混合云策…

FastAPI解决跨域报错net::ERR_FAILED 200 (OK)

目录 一、跨域问题的本质 二、FastAPI中的CORS处理 1. 安装FastAPI和CORS中间件 2. 配置CORS中间件 3. 运行FastAPI应用 三、解决跨域报错的步骤 四、案例:解决Vue.js与FastAPI的跨域问题 1. Vue.js前端应用 2. FastAPI后端API 3. 配置CORS中间件 4. 运行和测试 五…

为什么 JavaScript 中的 `new` 运算符报错?

在 JavaScript 中,new 运算符通常用于创建一个新对象并调用构造函数来初始化对象。然而,new 运算符可能会引发一些错误,通常是由于以下原因导致的: 构造函数没有正确的定义: 如果使用 new 运算符调用的函数没有正确地定…

霍尔效应电流传感器

适用于大电流,低功耗的电流检测: TVS选型: RS232的隔离电路: 单片机采集200伏高压 如何做隔离电路: 采用线性光电耦合器HCNR200实现高压直流母线电压的精确采样。还是用电阻分压,只是在ADC检测阶段加上隔离芯片:

如何设置Java爬虫的异常处理?

在Java爬虫中设置异常处理是非常重要的,因为网络请求可能会遇到各种问题,如连接超时、服务器错误、网络中断等。通过合理的异常处理,可以确保爬虫的稳定性和健壮性。以下是如何在Java爬虫中设置异常处理的步骤和最佳实践: 1. 使用…

ceph /etc/ceph-csi-config/config.json: no such file or directory

环境 rook-ceph 部署的 ceph。 问题 kubectl describe pod dragonfly-redis-master-0Warning FailedMount 7m59s (x20 over 46m) kubelet MountVolume.MountDevice failed for volume "pvc-c63e159a-c940-4001-bf0d-e6141634cc55" : rpc error: cod…

【计网笔记】习题

物理层 不属于物理层接口规范定义范畴的是(C) A. 接口形状 B. 引脚功能 C. 物理地址 D. 信号电平 【2023-912】光网络只能通过导向型介质传播。() 【2017-408】若信道在无噪声情况下的极限数据传输速率不小于信噪比为30dB条件下的…

最新 AI 编程工具全面对比:v0、Bolt.new、Cursor、Windsurf

随着人工智能的快速发展,越来越多的 AI 驱动的开发工具应运而生,旨在提升开发效率、优化开发流程,并减轻开发者的工作负担。在这个背景下,四款新兴的 AI 编程工具:v0、Bolt.new、Cursor 和 Windsurf,各具特…

【C++算法】35.位运算_两整数之和

文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 371. 两整数之和 题目描述: 解法 笔试的话直接 return ab; 接下来讲一下这题的解法: 位运算(异或运算-无进位相加&#xff…

PyCharm+Selenium+Pytest配置小记

1、下载ChromeDriver: Chrome130以后的Driver下载: Chrome for Testing availabilityhttps://googlechromelabs.github.io/chrome-for-testing/ (1)查看自己Crome浏览器的版本:设置-->关于 Chrome; &…

【C++】虚函数

类中声明函数成员的时候,在函数的前面加上virtual关键字,则该成员为虚函数 虚函数的特点 如果在类中定义的虚函数,那么系统会为这个类维护一个虚函数表类中会多出4个字节的指针去指向这个虚函数表,在虚函数表中保存了虚函数的首…

如何在UI自动化测试中创建稳定的定位器?

如何在UI自动化测试中创建稳定的定位器? 前言1. 避免使用绝对路径2. 避免在定位器中使用索引3. 避免多个类名的定位器4. 避免动态和自动生成的ID5. 确保定位器唯一6. 处理隐藏元素的策略7. 谨慎使用基于文本的定位器8. 使用AI创建稳定的定位器 总结 前言 在自动化测…

明日宣讲 香港科技大学广州|数据科学与分析学域硕博招生宣讲会【湖南大学专场】

📣📣📣明日宣讲 香港科技大学广州|数据科学与分析学域硕博招生宣讲会【湖南大学专场】 时间:2024年12月10日(星期二)15:00 地点:湖南大学信息科学与工程学院624会议室 报名链接&…

BurpSuite-8(FakeIP与爬虫审计)

声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址:IP伪造和爬虫审计_哔哩哔哩_bilibili 一、FakeIP 1.配置环境 BurpSuite是java环境下编写的,而今天的插件是python编写的&#xff0c…

2024 一带一路暨金砖国家技能发展与技术创新大赛【网络安全防护治理实战技能赛项】样题(中职组)

2024 一带一路暨金砖国家技能发展与技术创新大赛【网络安全防护治理实战技能赛项】样题(中职组) 1.基础设置和安全强化(xxx 分)1.3. 任务内容: 2.安全监测和预警(xxx 分)2.1. 任务一:建立目录安…

Qt C++ 显示多级结构体,包括结构体名、变量名和值

文章目录 mainwindow.hmainwindow.cppstructures.hmain.cpp QTreeView 和 QStandardItemModel 来实现。以下是实现这一功能的步骤和示例代码: 定义多级结构体: 假设你有一个多级结构体,如下所示: struct SubStruct {int subValue…

CISC和RISC的区别

CISC是什么 CISC是一种指令集设计方式,全程叫复杂指令集,这种指令设计模式包含大量的复杂指令和复杂的寻址方式, 以下是CISC架构的一些主要特点: 丰富的指令集:CISC处理器通常包含大量的指令,这些指令覆盖…

20 设计模式之职责链模式(问题处理案例)

一、什么是职责链模式 职责链模式是一种行为型设计模式,它允许将请求沿着处理者的链进行传递,直到有一个处理者能够处理它为止。换句话说,它将请求的发送者和接收者解耦,使得多个对象都有机会处理这个请求,从而避免了将…

linux基于systemd自启守护进程 systemctl自定义服务傻瓜式教程

系统服务 书接上文: linux自启任务详解 演示系统:ubuntu 20.04 开发部署项目的时候常常有这样的场景: 业务功能以后台服务的形式提供,部署完成后可以随着系统的重启而自动启动;服务异常挂掉后可以再次拉起 这个功能在ubuntu系统中通常由systemd提供 如果仅仅需要达成上述的场…