C++---内存管理

1 C/C++内存分布

栈区:由编译器自动分配和释放,存放运行时候的局部变量,函数参数,返回数据,返回地址。

堆区:一般由程序员自己分配,然后自己释放,例如栈的实现malloc开辟的数组空间。

数据段(静态区):存放全局变量,静态数据,常量,程序结束后自动释放。

代码段(常量区):存放常量字符串和可执行代码,程序结束自动释放。

2 C语言中动态内存管理方式:malloc/calloc/realloc/free

malloc:开辟空间,不初始化 (int*)malloc(sizeof(int)):开辟一个int大小的空间。

calloc:开辟空间并把每个字节初始化为0。(int*)calloc(4,sizeof(int)):开辟4个int大小的空间。

realloc(用于扩容):在内存找一段连续大小的空间,将传入的指针指向的内存内的字节全部拷贝过来,然后释放原指针空间,再把新大小的空间指针返回。(int*)realloc(_ptr,sizeof(int)*10)。

free:释放一段连续空间。free(_ptr),释放完之和_ptr为野指针,一般需要_ptr=NULL。

3 C++内存管理实现

C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。

在对内置类型开辟空间时new和malloc实质上是没什么区别的,但在对自定义类对象进行空间开辟时候,new和malloc的区别在于malloc只负责开辟空间不会进行初始化,而new开辟空间的同时会调用自定义类内的构造函数进行初始化。

 

注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[],注意:匹配起来使用。

new/delete和malloc/free最大的区别在于,new/delete开辟空间会调用构造函数,结束会调用析构函数。而malloc/free不会。

operator new与operator delete

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

/*
operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请空间失败,
尝试执行空
间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常。
*/
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{// try to allocate size bytesvoid *p;while ((p = malloc(size)) == 0)if (_callnewh(size) == 0){// report no memory// 如果申请内存失败了,这里会抛出bad_alloc 类型异常static const std::bad_alloc nomem;_RAISE(nomem);}return (p);
}
/*
operator delete: 该函数最终是通过free来释放空间的
*/
void operator delete(void *pUserData)
{_CrtMemBlockHeader * pHead;RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));if (pUserData == NULL)return;_mlock(_HEAP_LOCK); /* block other threads */__TRY/* get a pointer to memory block header */pHead = pHdr(pUserData);/* verify block type */_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));_free_dbg( pUserData, pHead->nBlockUse );__FINALLY_munlock(_HEAP_LOCK); /* release other threads */__END_TRY_FINALLYreturn;
}
/*
free的实现
*/
#define free(p) _free_dbg(p, _NORMAL_BLOCK)

通过上述两个全局函数的实现知道,operator new 实际也是通过malloc来申请空间,如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。operator delete 最终是通过free来释放空间的。

说白了operator new就是new子过程,new就等价于operator new之和在调用构造函数。而operator new在程序设计上又是由malloc为基础,区别于malloc的就是malloc申请空间失败之和返回值是0。而operator new申请空间失败后是直接抛异常。

定位new表达式

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

我们用malloc为p3开辟一个结构体大小的空间后,成员变量并没有初始化,但由于成员变量为private修饰的在外不可访问,这时候就可以利用定位new去进行初始化。

定位new格式为new(变量)+类名(初始化)。

malloc/free与new/delete的区别

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

区别是malloc/free是函数而new/delete是操作符。

malloc/free使用时候只开辟空间和销毁空间,而new/delete开辟空间会调用构造函数初始化,销毁空间会调用析构函数。

malloc返回值是void*使用时候需要强转类型,而new不用,编译器自动识别。

malloc申请空间失败返回的是NULL,而new申请空间失败会抛异常。

内存泄露

什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。 

内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。

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

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

相关文章

中秋假期用向日葵,临时工作需求远程控制随时解决

不知你是否在这美好时刻赏月看灯?有没有收到公司发的月饼呢? 在如今这个讲究降本增效的时代,仪式感早已变得稀少。公司发的月饼还没拆开,新消息就已弹出在公司群里。 此刻心里仿佛有万马奔腾,但很快又如湖水般平静&am…

拒绝千篇一律,AI帮你定制独一无二的个人写真

每个女人都渴望展现最美的自己,你是否厌倦了拍出千篇一律的照片?今天,我要告诉你一个秘密,用简单三步,即可打造属于你的独一无二个人写真!文生图、蒙版换脸、图生图,三步化身超级模特&#xff0…

基于TRIZ的救援机器人轻量化设计

在救援机器人设计中,轻量化是一个至关重要的目标,它直接关系到机器人的便携性、运输效率以及在复杂环境中的作业能力。TRIZ理论为我们提供了一套系统化的工具和方法,用于解决设计过程中遇到的各种挑战,特别是在实现轻量化目标时&a…

初识爬虫4

1.理解代理ip,正向代理和反向代理 2.代理ip分类,根据匿名度分类:透明,匿名,高匿 3.防止频繁向同一个域名发送请求被封ip,需使用代理ip # -*- coding: utf-8 -*- import requestsurl https://www.baidu.comproxies {…

从关键新闻和最新技术看AI行业发展(第三十一期2024.8.26-9.8) |【WeThinkIn老实人报】

写在前面 【WeThinkIn老实人报】旨在挖掘AI行业的关键新闻和最新技术,同时Rocky会对其中的关键信息进行解读,力求让读者们能从容掌握AI科技潮流。 欢迎大家关注Rocky的公众号:WeThinkIn 欢迎大家关注Rocky的知乎:Rocky Ding AIGC算…

微型导轨加工环境需避免的隐患!

微型导轨是一种小巧精密的线性定位解决方案,其高速度、低噪音的特点使得它在现代制造业中扮演着越来越重要的角色。而微型导轨对于加工环境的要求主要体现在以下几个方面: 1、温度控制:加工环境需要保持在适宜的温度范围内,过高或…

一分钟教你 全平台隔空投送文件 LoaclSend保姆级教程

主要内容 什么是LoaclSend 详细步骤 1.下载LoaclSend 2.使用MoleSDN 异地访问 3.一切就绪,打开LocalSend 发送文件 什么是LoaclSend 一款开源的文件传输工具,旨在提供简单、安全、快速的本地文件传输。 LocalSend可以免费使用且无需注册登录&…

音视频直播应用场景探讨之RTMP推流还是GB28181接入?

技术背景 好多开发者跟我们沟通音视频解决方案的时候,不清楚什么时候用RTMP推送模块,什么时候用GB28181设备接入模块,也不清楚二者差异化。实际上,RTMP推流和GB28181接入模块,在很多方面存在差异,如应用领…

个人学习笔记7-5:动手学深度学习pytorch版-李沐

#人工智能# #深度学习# #语义分割# #计算机视觉# #神经网络# 计算机视觉 13.10 转置卷积 例如,卷积层和汇聚层,通常会减少下采样输入图像的空间维度(高和宽)。然而如果输入和输出图像的空间维度相同,在以像素级分类…

【MPC】无人机模型预测控制复现Data-Driven MPC for Quadrotors项目(Part 1)

无人机模型预测控制复现Data-Driven MPC for Quadrotors项目 参考链接背景和问题方法与贡献实验结果安装ROS创建工作空间下载RotorS仿真器源码和依赖创建Python虚拟环境下载data_driven_mpc仓库代码下载并配置ACADO求解器下载并配置ACADO求解器的Python接口下载并配置rpg_quadr…

智能智造和工业软件研发平台SCSAI功能介绍

用爱编程30年,倾心打造工业和智能智造软件研发平台SCIOT,用创新的方案、大幅的让利和极致的营销,致力于为10000家的中小企业实现数字化转型,打造数字化企业和智能工厂,点击上边蓝色字体,关注“AI智造AI编程”或文末扫码…

union和union all的区别,别再傻傻分不清楚了!

union和union all的区别 一、 显示结果不同二、对重复结果的处理不同三、对排序的处理不同四、测试验证1.创建user表并插入测试数据2.通过union关联查询,发现结果自动去重3.通过union all关联查询,发现结果查询所有,并未去重 一、 显示结果不…

记录开发一个英语听力训练网站

背景 在当前全球经济衰退的背景下,IT相关的工作在国内的竞争也是越来越激烈,为了能够获得更多的可能性,英语的学习也许能为程序员打开一扇新的窗户,比如很多远程的工作尤其是国际化背景的工作团队,英语的协作沟通是必…

pdf怎么加页码?5种pdf添加页码指南分享,快来领取!

如何在一个包含大量页面的大型pdf文件中快速找到特定的页面或信息呢?最简便的方法就是为pdf添加页码。pdf添加页码能够清晰显示页面顺序,帮助读者轻松浏览大型pdf文档,同时也便于寻找特定章节和确定整体长度。然而,并非所有pdf文件…

【LeetCode】每日一题 2024_9_14 从字符串中移除星号(模拟)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动! 今天的题目曾经的我做过了 . . . 又是复习的一天 题目:从字符串中移除星号 代码与解题思路 func removeStars(s string) string {// 本题的核心:生成的输入保证总是可以执行题面中…

【大数据】MapReduce的“内存增强版”——Spark

【大数据】MapReduce的“内存增强版”——Spark 文章脉络 Spark架构 Spark-core SparkConf 和 SparkContext RDD Spark集群 Spark-sql 在大数据时代,数据处理和分析成为企业竞争的重要手段。Hadoop作为大数据处理的基石,其核心组件MapReduce在众多…

完结马哥教育SRE课程--就业篇

文章目录 一、Linux基础入门1.Linux基本架构2.什么是shell3.执行命令4.Shell中的两类命令5.常见命令6.输出信息echo7.tab键补全8.获取帮助 二、文件管理和IO重定向1.文件系统目录结构2.文件系统目录功能3.linux下的文件类型4.文件操作命令5.文件状态stat6.确定文件内容7.文件通…

如何搭建一个自己的外卖会员卡系统?

大家好,我是鲸天科技千千,大家都知道我是做小程序开发的,平时会给大家分享一些互联网相关的创业项目,感兴趣的可以跟我关注一下。 搭建一个首先就是要搭建一个自己的返利小程序也就是外卖会员卡小程序,然后客户在我们…

锁表导致系统挂了,谨慎DDL操作

作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验, Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、 高斯及Greenplum备份恢复, 安装迁移,性能优化、故障…

【Ubuntu】Ubuntu双网卡配置 实现内外网互不影响同时可用

【Ubuntu】Ubuntu双网卡配置 实现内外网互不影响同时可用 建议前提配置用到的命令参考文献: 建议 本文仅作个人记录,请勿完全照搬,建议直接看此视频,按作者的步骤进行配置 linux配置内外网(ubuntu举例)&am…