c/c++内存管理

我们先了解一下c/c++中的程序内存区域划分:

栈——非静态局部变量、函数参数、返回值等,栈是向下增长的。

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

堆——用于程序运行时动态内存分配,堆是可以上增长的。

数据段——存储全局数据和静态数据。

代码段——可执行的代码/只读常量。

C语言中的动态内存管理方式与c++的对比:

申请一个整型大小的空间:申请和释放单个元素的空间,使用new和delete操作符

int main()
{int* a1 = (int*)malloc(sizeof(int));//Cfree(a1);int* a2 = new int;//C++delete a2;return 0;
}

动态开辟一个整型数组:申请和释放连续的空间,使用new[]和delete[]

int main()
{int* a1 = (int*)malloc(sizeof(int) * 10);//Cfree(a1);int* a2 = new int[10];//C++delete[] a2;//释放空间return 0;
}

malloc不可以初始化(只负责开空间),而new可以初始化:

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

class A
{
public:A(int a = 0):_a(a){}
private:int _a;
};int main()
{A* aa = new A(10);//初始化,调用构造函数delete aa;//调用析构函数return 0;
}

扩展:

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


对于内置类型new、delete的工作原理:

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

对于自定义类型new、delete的工作原理:

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来释放空间。


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在释放空间前会调用析构函数完成空间中资源的清理。
 

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

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

相关文章

Django教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统&#xf…

深入理解设计模式:设计模式定义、设计原则以及组织编目

文章目录 一、设计模式1.1 设计模式的起源1.2 设计模式的定义1.3 记录要素1.4 合理使用模式 二、设计模式的六大原则2.1 开闭原则(Open-Closed Principle, OCP)2.1.1 定义2.1.2 原则分析2.1.3 开闭原则的意义所在 2.2 单一职责原则(Single Responsibility Principle, SRP)2.4.1…

Tomcat的基本使用,如何用Maven创建Web项目、开发完成部署的Web项目

Tomcat 一、Tomcat简介二、Tomcat基本使用三、Maven创建Web项目3.1 Web项目结构3.2开发完成部署的Web项目3.3创建Maven Web项目3.3.1方式一3.3.2方式二(个人推荐) 总结 一、Tomcat简介 Web服务器: Web服务器是一个应用程序(软件&…

android数据的储存、文件的储存、SharedPreferences储存、SQLite的基本用法

一、文件的储存 1、将数据储存到文件中 Context类中提供了openfileOutput()方法,用来获取一个文件流,这个方法接收两个参数,第一个参数是文件名,在文件创建的时候使用的就是这个名称,注意这里指定的文件名不可以包含…

AE基础知识

一、基础概念 1.AE的用途(合成) AE是一款用于高端视频特效系统的专业特效合成软件,通过对收集到的素材进行数字化的编辑组合到一起,进行艺术性的再加工后得到的最终作品。 2.帧 帧——就是影像动画中最小单位的单幅影像画面&a…

FPGA XDMA 中断模式实现 PCIE3.0 AD7606采集 提供2套工程源码和QT上位机源码

目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案AD7606数据采集和缓存XDMA简介XDMA中断模式QT上位机及其源码 5、vivado工程1--BRAM缓存6、vivado工程2--DDR4缓存7、上板调试验证8、福利:工程代码的获取 1、前言 PCIE(PCI Express&am…

设计模式什么情况下适合使用呢?

很多情况下设计模式是一种经过验证的解决特定问题的最佳实践。设计模式提供了一种标准化的方式来解决常见的软件设计问题,并提供了一种可重用的解决方案。设计模式可以帮助开发人员编写具有高可维护性、可扩展性和可重用性的代码。 设计模式适用于以下情况&#xf…

redis之Bitmap

位图数据结构其实并不是一个全新的玩意,我们可以简单的认为就是个数组,只是里面的内容只能为0或1而已(二进制位数组)。 GETBIT用于返回位数组在偏移量上的二进制位的值。值得我们注意的是,GETBIT的时间复杂度是O(1)。 GETBIT命令的执行过程如…

Ubuntu系统adb开发调试问题记录

Ubuntu系统adb开发调试问题记录 一、adb devices no permissions二、自定义adb server端口三、动态库目录四、USB抓包 一、adb devices no permissions lsusb -t 设备树直观地查看设备的Bus ID和Device Num,lsusb找到对应的PID和VID编辑udev规则 sudo vim /etc/ud…

百度文心千帆大模型平台:企业级大模型服务的新航标

随着人工智能和大数据的快速发展,大模型平台正越来越受到各大企业和个人开发者的青睐。本文将以百度最新推出的文心千帆大模型平台为例,深入分析其在国家战略布局,经济发展趋势,市场变化动向和技术研发周期等方面的影响和应用。同…

JavaScript--Promise类

在学习Promise类内容前,你需要先了解什么是异步编程,可以参考JavaScript--异步编程,JavaScript--定时事件 Promise介绍: Promise是JavaScript中用于处理异步操作的对象。它代表着一个异步操作的最终完成(或失败)以及…

matplotlib从起点出发(6)_Tutorial_6_Animations

1 在matplotlib中使用动画 基于其绘图功能,matplotlib还提供了一个使用动画模块生成动画animation的接口。动画是一系列帧,其中每个帧对应于图形Figure 上的一个绘图。本教程介绍了有关如何创建此类动画的一般准则以及可用的不同选项。 import matplot…

php 服务器 http状态码为499的解决办法

原因:某些http请求服务端处理太慢,影响了其他http请求。 1.配置php.ini的max_execution_time和max_input_time。但是改后还是报了不少的499。 (set_time_limit()函数和配置指令max_execution_time只影响脚本本身执行的时间。任何发生在诸如…

行为型设计模式之观察者模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦!!! 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everythi…

解决报错Avoid using non-primitive value as key, use string/number value instead.

找到图中画圈的文件这个错误信息的意思是要避免使用非基本值作为键&#xff0c;而是使用字符串/数字值代替。 [1] 这个错误通常出现在使用<el-select>中的<el-option>进行循环遍历值时。 [2] 这个错误的解决方案是检查是否有重复的键值&#xff0c;并确保使用字符…

【Python】aio Queue 的超时封装

一般封装生产者消费者模型的时候会用到 asyncio.Queue&#xff0c;queue 的 put 和 get 操作都是阻塞的&#xff08;当然可以通过 _nowait 方法改为非阻塞&#xff09;&#xff0c;取数据的时候如果没数据则会一直阻塞。下面通过计数的方法给 asyncio.Queue 添加超时操作&#…

从源码编译 tensorFlow ,启用CPU 指令加速

适合只有cpu,没有显卡的AI 玩家&#xff0c;初学者 问题&#xff1a;AVX AVX2 AVX_VNNI FMA 是什么? AVX、AVX2、AVX_VNNI 和 FMA 都是针对 Intel CPU 的特殊指令集&#xff08;instruction set&#xff09;&#xff0c;用于加速数值计算和向量化操作。这些指令集提供了高级…

【分布鲁棒、状态估计】分布式鲁棒优化电力系统状态估计研究[几种算法进行比较](Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

基于BIM+AI的建筑能源优化模型【神经网络】

推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 AEC&#xff08;建筑、工程、施工&#xff09;行业的BIM 技术&#xff0c;允许在实际施工开始之前虚拟地建造建筑物&#xff1b; 这带来了许多有形和无形的好处&#xff1a;减少成本超支、更有效的协调、增强决策权等等。…

C#实现数据库数据变化监测(sqlservermysql)

监测数据库表数据变化&#xff0c;可实现数据库同步&#xff08;一主一从&#xff08;双机备份&#xff09;&#xff0c;一主多从&#xff08;总部数据库&#xff0c;工厂1&#xff0c;工厂2&#xff0c;工厂数据合并到总部数据&#xff09;&#xff09; sqlserver 启用数据库…