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

C++的动态内存管理(new/delete的用法,malloc和new的区别,内存的具体分布)

C的动态内存管理允许程序在运行是根据需要分配内存和释放内存主要通过new和delete运算符来完成。与静态内存分配相比动态内存分配更具有灵活性但它需要手动管理来避免内存泄漏。一·C/C中内存的具体分布先来了解一下内存的几个区域栈区向下增长非静态局部变量/函数参数/返回值即用即销毁的数据堆区向上增长动态申请的数据堆区的内存大小不固定可根据需要来进行内存的分配与释放静态区全局数据和静态数据static其在编译时就确定了变量的大小和内存地址具有固定的大小和位置代码区可执行代码和常量下面来看一道关于内存管理的面试题答案是C,C,C,A,A从左往右A,A,A,D,A,B前面提到静态区存放的是全局数据和静态数据所以很明显可以判断出前三个globalVarstaticGlobalVarstaticVar是存放在静态区数据段而localVar和num1都是在函数中临时创建的所以他们存放在栈区char2是一个数组也是在函数中被临时创建存放在栈区*char为首元素地址‘a’是这个数组的首元素而这个数组在栈区所以*char2存放在栈区pchar3是一个指针存放在栈区。注const并不会影响数据存储的区域可见这两块地址是挨着的所以const没有改变数据存储的区域*pchar3就是“a,b,c,d,/0”,存放在常量区ptr1和pchar3都是指针变量存放在栈区*ptr1就是动态开辟出来的应该存放在堆区2.填空题40544或84或8因为num1是整形数组但是只初始化了四个所以就是4*1040char2“abcd/0”char2里面存放的是字符串sizeofchar2就是计算该字符串的大小千万不能把/0给忘了。而strlen则是计算该字符串在‘/0’之前的字符串的大小pchar3和ptr1都是指针变量任何指针变量的大小都是4/8看是在32位还是在64位环境下同理strlenphar3也是计算/0之前的大小3.sizeof和strlen的区别sizeof() 是操作符不是函数它是用来计算对象或者类型创建的对象所占内存空间的大小strlen是一个函数计算字符串有效长度不包括/0二·C中的动态内存管理1new/delete操作内置类型C中的动态内存管理跟C语言的有些许差异因为C语言中的malloc/free使用起来比较麻烦并且不能对申请好的数据进行初始化所以在C中就做了相应的改进。使用new/delete来进行动态的申请内存。注new/delete是运算符而malloc/free是函数#includeiostream using namespace std; int main() { //C语言 int* p1 (int*)malloc(sizeof(int)); free(p1); int* p2 new int(10);//开辟一个初始化为10的空间 delete p2; int* p3 new int[10];//开辟10个int类型的空间 delete[]p3; return 0; }由此可见C通过new和delete操作符进行动态内存管理我们来看看C是如何使用new/delete来动态开辟空间的1.new操作符后直接跟类型2.要注意圆括号内是对该变量的初始化而方括号则是要开辟的数量3.申请和释放连续的空间使用new[]和 delete[]4.必须配对使用不能malloc/delete或者new/free长时间可能会导致内存泄露2new/delete操作自定义类型在申请自定义类型的空间时malloc只会申请空间并不会对其初始化而new则会去调用构造函数对该对象进行初始化delete则会对应的调用析构函数很显然malloc在开辟完空间后没有对p1进行初始化但是new和delete去调用了构造和析构函数注意malloc/free和new/delete必须配套使用不能随意使用时间长了可能会造成内存泄漏导致程序崩溃3malloc/free和new/delete的区别malloc/free和new/delete的共同点是都是从堆上申请空间并且需要用户手动释放。不同的地方是1. malloc和free是函数new和delete是操作符2. malloc申请的空间不会初始化new可以初始化3. malloc申请空间时需要手动计算空间大小并传递new只需在其后跟上空间的类型即可 如果是多个 对象[]中指定对象个数即可4. malloc的返回值为void*, 在使用时必须强转new不需要因为new后跟的是空间的类型5. malloc申请空间失败时返回的是NULL因此使用时必须判空new不需要但是new需要捕获异常6. 申请自定义类型对象时malloc/free只会开辟空间不会调用构造函数与析构函数而new在申请空间 后会调用构造函数完成对象的初始化delete在释放空间前会调用析构函数完成空间中资源的清理三.operator new和operator delete函数operator new和operator delete并不是直接的运算符重载而是C库里的全局函数。new在底层通过调用operator new来进行申请空间delete在底层通过调用operator delete来进行空间的释放下面来看一下operator new的用法int main () { A* p6 (A*)operator new (sizeof(A)); operator delete(p6); return 0; }由这个不难看出和malloc的用法大同小异但是他们还是有一定的区别就像上面这段代码并没有像malloc一样检查空间是否开辟成功因为 operator new开辟空间失败是会抛异常的其实operator new/operator delete被设计出来就是给new和delete服务的我们可以通过反汇编来查看反汇编中的call就是去调用子函数的由此可见在new的底层就是先去调用operator new去开辟空间然后调用构造函数区初始化其实原理上就是把new转换成调用operator new构造函数将delete转换成调用析构函数operator delete四.new和delete的实现原理1内置类型如果申请的是内置类型的空间new和mallocdelete和free基本类似不同的地方是new/delete申请和 释放的是单个元素的空间new[]和delete[]申请的是连续空间而且new在申请空间失败时会抛异常 malloc会返回NULL。2自定义类型new的原理 1. 调用operator new函数申请空间2. 在申请的空间上执行构造函数完成对象的构造delete的原理 1. 在空间上执行析构函数完成对象中资源的清理工作2. 调用operator delete函数释放对象的空间new T[N]的原理 1. 调用operator new[]函数在operator new[]中实际调用operator new函数完成N个对象空间的申请2. 在申请的空间上执行N次构造函数delete[]的原理 1. 在释放的对象空间上执行N次析构函数完成N个对象中资源的清理2. 调用operator delete[]释放空间实际在operator delete[]中调用operator delete来释放空间

相关文章:

C++的动态内存管理(new/delete的用法,malloc和new的区别,内存的具体分布)

C的动态内存管理允许程序在运行是根据需要分配内存和释放内存,主要通过new和delete运算符来完成。与静态内存分配相比,动态内存分配更具有灵活性,但它需要手动管理来避免内存泄漏。一C/C中内存的具体分布先来了解一下内存的几个区域&#xff…...

【OpenClaw企业级智能体实战】第27篇:Skill生态运营——企业私有Skill商店的搭建与审核机制

摘要:2026年ClawHavoc供应链攻击事件曝光超1200个恶意Skill渗透公共技能市场,工信部明确要求企业审慎使用第三方技能包并严格审查代码。本文基于真实安全事件与行业实践,完整讲解企业私有Skill商店从0到1搭建方案,覆盖小团队极简GitLab私有仓库、中大型企业Nacos 3.2私有Re…...

边缘计算语音识别实战:ARM平台深度部署方案与嵌入式AI部署指南

边缘计算语音识别实战:ARM平台深度部署方案与嵌入式AI部署指南 【免费下载链接】sherpa-onnx Speech-to-text, text-to-speech, speaker diarization, speech enhancement, source separation, and VAD using next-gen Kaldi with onnxruntime without Internet con…...

IDA Pro 9.3sp1 发布,主要针对 V850 反编译器的改进与问题修复

IDA Pro 9.3sp1 (macOS, Linux, Windows) - 强大的反汇编程序、反编译器和多功能调试器 A powerful disassembler, decompiler and a versatile debugger. In one tool. 请访问原文链接:https://sysin.org/blog/ida-pro/ 查看最新版。原创作品,转载请保…...

【42】软考软件设计师——设计模式代码实战|单例/工厂/策略/观察者 真实业务案例精讲

摘要:本文是《软件设计师50讲通关|从零基础到工程师职称》专栏第42篇,属于模块五:算法与代码实战强化第四篇,聚焦软考上午选择题与下午代码填空题四大高频设计模式:单例模式(双重检查锁)、工厂模式、策略模式、观察者模式。全文超4800字,搭配Mermaid类图/时序图清晰展…...

CLIP ViT-H-14快速部署:Docker镜像替代方案与本地Python服务对比

CLIP ViT-H-14快速部署:Docker镜像替代方案与本地Python服务对比 想快速搭建一个能看懂图片的AI服务吗?比如,你想让电脑自动给照片打标签、找相似图片,或者做个以图搜图的功能。今天要聊的CLIP ViT-H-14模型,就是干这…...

js内建对象

JavaScript 对象 在 JavaScript中,几乎所有的事物都是对象、在 JavaScript 中,对象是非常重要的,当你理解了对象,就可以了解 JavaScript 。 一维数组: 第一种:使用new关键字和Array()构造函数 a、 va…...

FastAPI子应用挂载:别再让root_path坑你一夜案

Julia(julialang.org)由Stefan Karpinski、Jeff Bezanson等在2009年创建,目标是融合Python的易用性、C的高性能、R的统计能力、Matlab的科学计算生态。 其核心设计哲学是: 高性能:编译型语言(JIT&#xff0…...

用OpenSearch实现电商语义搜索

想象一下,一位顾客搜索"适合团队通话的经济型无线耳机"。传统的关键词搜索返回零结果,因为您的商品标题中并不包含所有这些确切词汇。但借助由生成式 AI 嵌入模型驱动的语义搜索,OpenSearch 能够理解用户意图——并将您最好的带降噪…...

用Claude Agent SDK构建CLI工具

我已经向我的团队说了几个月,Claude Code包装器将成为2026年的Cursor。在花了大量时间深入研究Claude Agent SDK后,是的,在像其他人一样仔细研究了泄露的源代码之后,我比以往任何时候都更加确信。转变是真实的:不再是来…...

Audio Slicer音频分割工具:用智能静音检测告别手动剪辑烦恼

Audio Slicer音频分割工具:用智能静音检测告别手动剪辑烦恼 【免费下载链接】audio-slicer A simple GUI application that slices audio with silence detection 项目地址: https://gitcode.com/gh_mirrors/aud/audio-slicer 你是否曾为处理长音频文件而烦恼…...

SpringMVC 请求保姆级教程:路径映射、参数传递、JSON 交互、日期处理一网打尽(Spring系列12)

摘要:SpringMVC 作为 Java Web 开发中最主流的 MVC 框架,核心职责就是接收请求、处理数据、响应结果,这也是 SpringMVC 学习的重中之重。本文将从环境搭建、请求映射、参数传递(普通 / POJO / 数组 / 集合 / JSON / 日期&#xff…...

AI原生软件技术债爆发前夜:92%的GenAI项目在V1.5版本后陷入交付瘫痪,你中招了吗?

第一章:AI原生软件技术债的本质与临界征兆 2026奇点智能技术大会(https://ml-summit.org) AI原生软件的技术债并非传统工程债务的简单延伸,而是由模型-代码耦合失衡、数据契约隐式化、推理路径不可观测等结构性缺陷共同催生的“认知性负债”。当开发团队…...

AI agent开发笔记

AI模型强大程度:google CC > Microsoft copilot 1.在该路径下添加,AI生成规则文档:copilot-instructions.md...

LibreDWG:免费开源的DWG文件转换终极解决方案

LibreDWG:免费开源的DWG文件转换终极解决方案 【免费下载链接】libredwg Official mirror of libredwg. With CI hooks and nightly releases. PRs ok 项目地址: https://gitcode.com/gh_mirrors/li/libredwg 你是否经常遇到CAD设计文件格式不兼容的问题&…...

C++一维数组完全指南

一、什么是一维数组?用来一次性存储多个相同类型的数据内存中连续存放有统一的名字,用 ** 下标(索引)** 区分每个元素下标从 0 开始(非常重要)二、定义与初始化(四种常用方式)// 1. …...

BabelDOC终极指南:如何在企业环境中构建离线文档翻译解决方案

BabelDOC终极指南:如何在企业环境中构建离线文档翻译解决方案 【免费下载链接】BabelDOC Yet Another Document Translator 项目地址: https://gitcode.com/GitHub_Trending/ba/BabelDOC BabelDOC是一款专业的企业级文档翻译工具,专注于PDF科学论…...

#50_基尔霍夫两大定律

50_基尔霍夫两大定律 50_基尔霍夫两大定律0. 引言0.1 基尔霍夫定律的历史背景0.2 基尔霍夫定律在电路分析中的地位0.3 两大定律的适用条件1. 基本概念1.1 电路的基本术语a. 支路b. 节点c. 回路d. 网孔1.2 电流的参考方向1.3 电压的参考极性2. 基尔霍夫电流定律(KCL&…...

2025年代码托管平台深度评测:Gitee如何领跑DevOps时代

在数字化转型加速的2025年,代码托管平台已成为软件开发的基础设施。随着DevOps理念的深度渗透和CI/CD实践的广泛普及,开发者对代码托管平台的需求已经从简单的版本控制升级为全生命周期管理。在这一背景下,Gitee凭借其本地化优势和创新功能设…...

ISE 14.7在Win10虚拟机里卡死闪退?一个输入法设置帮你搞定(附完整安装避坑指南)

ISE 14.7虚拟机环境配置全攻略:从输入法陷阱到FPGA开发实战 刚接触FPGA开发的新手们,是否曾在虚拟机里安装ISE时遭遇过输入项目名称就闪退的崩溃瞬间?这个问题困扰过无数开发者,而解决方案往往藏在不显眼的系统设置里。本文将带你…...

ArduPilot SITL不止能飞Copter:手把手教你用同一套环境玩转无人机、固定翼和无人车仿真

ArduPilot SITL全平台仿真指南:从无人机到无人车的无缝切换 当你第一次成功运行ArduPilot的多旋翼无人机仿真时,那种兴奋感可能还记忆犹新。但你知道吗?你刚刚搭建的这套Ubuntu 22.04环境,其实是一把能打开整个无人系统世界的万能…...

无人机多模态火灾图像识别 多光谱野火识别 智慧林业火灾识别 火灾识别图像数据集 多模态数据集 可见光+红外图像对其数据集第10652期

摘要 该系列均采用无人机航拍采集的多光谱野火同步对比影像。本数据集为完整版 3 中的单次燃烧场景子集,专门面向火灾检测、语义分割等计算机视觉任务构建。数据集包含622 组标注为“有火”的图像四元组,以及 116 组标注为“无火”的图像四元组。其中无火…...

理想汽车又孵化一家具身公司......

点击下方卡片,关注“自动驾驶之心”公众号戳我-> 领取自动驾驶近30个方向学习路线编辑 | 自动驾驶之心>>自动驾驶前沿信息获取→自动驾驶之心知识星球据雷峰网《新智驾》报道,理想汽车前AI首席科学家陈伟联合理想汽车前产品线总裁张骁创办的公司…...

二次元游戏模组管理革命:为什么你需要一个统一的启动器平台?

二次元游戏模组管理革命:为什么你需要一个统一的启动器平台? 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher 你是否曾为管理多个二次元游戏的模组而头疼&…...

DVWA文件上传漏洞通关实录:从Low到High,手把手教你三种绕过姿势(附Burp Suite实战)

DVWA文件上传漏洞实战指南:从基础绕过到高级技巧 在Web安全领域,文件上传漏洞一直是最常见也最具破坏力的漏洞类型之一。DVWA(Damn Vulnerable Web Application)作为经典的漏洞练习平台,其文件上传模块设置了从低到高三…...

创新实训个人工作-初步搭建(二)

一、思考在完成 AI 问答页的基础搭建后,我开始思考:如果这个页面真的面向用户使用,它应该像什么?我觉得他的回答必须要更加专业,可以在生活中可以真实可用。所以后续打磨,我主要围绕两条线展开:…...

glogg终极指南:如何通过智能架构设计实现高性能日志分析

glogg终极指南:如何通过智能架构设计实现高性能日志分析 【免费下载链接】glogg A fast, advanced log explorer. 项目地址: https://gitcode.com/gh_mirrors/gl/glogg glogg是一款专为开发者和系统管理员设计的跨平台日志查看器,它巧妙地将grep的…...

LS-WVL系统安装全攻略:从修复模式到中文配置一步到位

LS-WVL系统安装全攻略:从修复模式到中文配置一步到位 当你第一次拿到LS-WVL这台NAS设备时,可能会被它略显复杂的安装流程难住。别担心,这篇指南将带你从零开始,一步步完成从系统安装到中文配置的全过程。不同于市面上那些泛泛而谈…...

Janus-Pro-7B部署案例:NVIDIA T4显卡上稳定运行的7B多模态方案

Janus-Pro-7B部署案例:NVIDIA T4显卡上稳定运行的7B多模态方案 1. 多模态AI的新选择:Janus-Pro-7B 在AI技术快速发展的今天,多模态模型正成为新的热点。传统的AI模型往往只能处理单一类型的数据,要么是文字,要么是图…...

告别Office!8个理由让你立即尝试这款在线PPT制作工具

告别Office!8个理由让你立即尝试这款在线PPT制作工具 【免费下载链接】PPTist PowerPoint-ist(/pauəpɔintist/), An online presentation application that replicates most of the commonly used features of MS PowerPoint, allowing for…...