C++ 内存管理

new与delete      

  在C语言中,我们已经了解了三个动态内存管理的函数——malloc,calloc以及realloc,通过动态内存开辟,申请和释放空间更加的灵活

int main() {int* arr = (int*)malloc(sizeof(int) * 10);for (int i = 0; i < 10; i++) {arr[i] = i;printf("%d ", arr[i]);}int* arr2 = (int*)calloc(20, sizeof(int));for (int i = 0; i < 20; i++) {arr2[i] = i;printf("%d ",arr2[i]);}free(arr2);arr = (int*)realloc(arr, 50);free(arr);arr = NULL;arr2 = NULL;
}

        在C++中,C语言的内存管理方式可以继续使用,但是在C++中又稍显不足,因此C++提出了自己的内存管理方式:newdelete。

下面我们就结合代码来讲解一下new和delete两个操作符

int main() {//开辟10个int类型的空间int* arr1 = (int*)malloc(sizeof(int) * 10);int* ptr1 = new int[10];//开辟20个int类型的空间,并初始化为0int* arr2 = (int*)calloc(20, sizeof(int));int* ptr2 = new int[20]{ 0 };free(arr1);free(arr2);delete ptr1;delete []ptr2;//注意[]的匹配使用
}

通过调试-监测内存可以看到,ptr2里20个数据的确被初始化为0 

        对于自定义类型,也可以通过new和delete来申请和释放空间,同时会自动调用各自的构造函数和自购函数

class A {
public:A(int _arr=0) {cout << "A()" << endl;}~A() {cout << "~A()" << endl;}
private:int _arr;
};
int main() {//malloc,free和new delete最大的区别是:new和delete会自动调用构造函数和析构函数A* ptr = (A*)malloc(sizeof(A));free(ptr);A* ptr2 = new A(100);delete ptr2;
}

 通过编译结果可以知道,new和delete除了开空间还会自动调用构造函数和析构函数的

 operator new与 operator delete

        new进行动态内存的申请,delete进行动态内存的释放,其实在底层中,new是通过调用operator new来申请空间,delete在通过调用operator delete来释放空间

        那么operator new和operator delete是如何能够实现动态内存的申请和释放的呢?

对于operator new,实际上是通过malloc函数来申请空间的,如果申请空间成功时直接返回,否则执行用户提供的空间不足应对措施,如果提供措施就继续申请,否则抛异常

对于operator delete,实际上是通过free函数来释放空间的

new和delete的实现原理

1.对于内置类型

        new/delete申请和释放的是单个元素的空间,new[ ]和delete[ ]申请的是连续的空间,而且new在申请失败时会抛异常,malloc会返回NULL

        new T[N]会调用 operator new[ ]函数,完成N个对象的空间申请,然后对N个对象调用构造函数

        delete[ ]会调用N次析构函数进行资源清理,然后在N个对象的空间上operator delete函数来释放空间

2.对于自定义类型

        new会调用operator new函数进行申请空间,会自动调用构造函数完成对象的构造

        delete会调用析构函数完成对象中资源的清理工作,调用operator delete函数释放对象空间

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

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

相关文章

2. JVM的架构模型和生命周期

一、前言 Java 编译器输入的指令流是一种基于栈的指令集架构&#xff0c;还有另一种指令集架构是基于寄存器的指令集架构。 二、两种架构之前的区别 基于栈的架构特点&#xff1a; 设计和实现更简单&#xff0c;适用于资源受限的系统&#xff1b;避开了寄存器的分配难题&am…

Flutter3.22.2中SliverAppBar设置背景色滑动显示颜色错误

在使用Flutter项目开发中&#xff0c;可能会有页面需要滑动收起标题栏的效果&#xff0c;一般都会使用SliverAppBar来实现&#xff0c;当项目的Flutter的SDK版本升级到3.4后&#xff0c;发现使用了SliverAppBar的页面&#xff0c;在滑动过程中&#xff0c;标题栏和状态栏的颜色…

vim 编辑器

1. 学习 vim 的目的 在工作中&#xff0c;要对 服务器 上的文件进行 简单 的修改&#xff0c;可以使用 ssh 远程登录到服务器上&#xff0c;并且使用 vim 进行快速的编辑即可常见需要修改的文件包括&#xff1a;源程序配置文件&#xff0c;例如 ssh 的配置文件 ~/.ssh/config …

瑞派宠物医院轮值总裁胡文强受邀出席第三届宠物产业大会

中国宠物产业蓬勃发展&#xff0c;成为推动国民经济持续增长的重要力量&#xff0c;宠物市场规模持续扩大。为进一步推动宠物产业的创新驱动&#xff0c;加强产业上下游深度交流和协同发展&#xff0c;中国畜牧业协会宠物产业分会于2024年10月15-17日在浙江杭州召开第三届宠物产…

Linux云计算 |【第五阶段】CLOUD-DAY7

主要内容&#xff1a; 在kubernetes平台上理解掌握各种控制器的用法&#xff1a;掌握kubectl管理命令、掌握POD原理、掌握集群调度的规则、熟悉控制器资源文件&#xff1b; 一、kubectl 常用命令 Kubectl是用于控制Kubernetes集群的命令行工具&#xff1b; - 格式&#xff1…

[java][框架]springMVC(1/2)

目标 知道SpringMVC的优点编写SpringMVC入门案例使用PostMan发送请求掌握普通类型参数传递掌握POJO类型参数传递掌握json数据参数传递掌握响应json数据掌握rest风格快速开发 一、SpringMVC简介 1 SpringMVC概述 问题导入 SpringMVC框架有什么优点&#xff1f; 1.1 Spring…

dns主从服务器的配置

主从dns服务器上都要&#xff1a; 关闭防火墙&#xff1a; [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 挂载和下载bind [rootlocalhost ~]# mount /dev/sr0 /mnt [rootlocalhost ~]# dnf install bind -y 主服务器配置&#xff1a; [rootlo…

【大咖云集,院士出席 | ACM独立出版】第四届大数据、人工智能与风险管理国际学术会议 (ICBAR 2024,11月15-17日)--冬季主会场

第四届大数据、人工智能与风险管理国际学术会议 (ICBAR 2024)--冬季主会场 2024 4th International Conference on Big Data, Artificial Intelligence and Risk Management 官方信息 会议官网&#xff1a;www.icbar.net 2024 4th International Conference on Big Data, Art…

linphone sdk sip音视频通话高级教程

本文主要基于c接口讲解linphone结合freeswitch在多平台的运用。大纲如下 linphone sdk下载地址sdk导入本文基于console程序演示,qt工程也行简单的音频呼叫,sip服务器使用freeswitch音频设置(设备、增益、铃声、回声消除、编码等)视频呼叫 默认有vp8 这里导入下h264视频设置(…

【Jenkins】 上传docker包并推送到远程仓库

文章目录 1. 前置工作安装和配置Jenkins设置Docker环境 2. 相关配置流程创建项目配置参数 1. 前置工作 安装和配置Jenkins 在开始使用Jenkins之前&#xff0c;需要确保已经安装和配置了Jenkins服务器。您可以按照以下步骤进行安装和配置&#xff1a; 下载Jenkins并安装&…

OBOO鸥柏丨传媒广告行业的创新应用解决数字技术短板

在新媒体文化传媒广告行业&#xff0c;如何吸引受众的注意力并有效传达信息一直是行业技术型数字化媒体转型关注的重点。OBOO鸥柏立式广告机作为这一领域的创新显示产品新技术&#xff0c;搭载VS6.0/满天星(MTSTAR)信息发布系统网络云平台技术科技&#xff0c;以其独特的技术优…

windows家庭版安装docker环境步骤-家庭版

1.家庭版没有虚拟化设置&#xff0c;下面代码保存到bat后缀文件&#xff0c;然后管理员权限执行 pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt for /f %%i in (findstr /i . hyper-v.txt 2^>nul) do dism /online /nore…

SQL Server身份验证模式

SQL Server是一个广泛使用的关系数据库管理系统&#xff0c;通常使用两种身份验证模式&#xff1a;Windows身份验证和SQL Server身份验证。理解这些身份验证方式的概念与更改方式的操作&#xff0c;对于数据库管理员和开发者至关重要。本文将详细介绍身份验证方式的概念以及如何…

蓝桥杯-网络安全比赛题目-遗漏的压缩包

小蓝同学给你发来了他自己开发的网站链接&#xff0c; 他说他故意留下了一个压缩包文件&#xff0c;里面有网站的源代码&#xff0c; 他想考验一下你的网络安全技能。 &#xff08;点击“下发赛题”后&#xff0c;你将得到一个http链接。如果该链接自动跳转到https&#xff0c;…

【Git】Liunx环境下Git的使用:“克隆,提交,推送“

目录 一、常用参数 二、我们为什么要使用Git&#xff1f; 三、创建远程仓库 第一步&#xff1a;创建对应代码托管平台账号。 第二步&#xff1a;在托管平台创建仓库 第三步&#xff1a;完善仓库内容&#xff08;选择性使用&#xff09; 开源和私有 四、克隆远程仓库到本…

entos7离线安装xrdp和图形化桌面

1、查看Linux系统环境 cat /etc/os-release NAME"CentOS Linux" VERSION"7 (Core)" ID"centos" ID_LIKE"rhel fedora" VERSION_ID"7" PRETTY_NAME"CentOS Linux 7 (Core)" ANSI_COLOR"0;31" CPE_NAME…

Qt学习笔记(三)网络编程

系列文章目录 Qt开发笔记&#xff08;一&#xff09;Qt的基础知识及环境编译&#xff08;泰山派&#xff09; Qt学习笔记&#xff08;二&#xff09;Qt 信号与槽 Qt学习笔记&#xff08;三&#xff09;网络编程 文章目录 系列文章目录前言一、Qt网络模块二、TCP网络的编写2.1 …

uni-app发起请求以及请求封装,上传及下载功能(六)

文章目录 一、发起网络请求1.使用及封装2. https 请求配置自签名证书3.拦截器 二、上传下载1.上传 uni.uploadFile(OBJECT)2. 下载 uni.downloadFile(OBJECT) 一、发起网络请求 uni-app中内置的uni.request()已经很强大了&#xff0c;简单且好用。为了让其更好用&#xff0c;同…

快速理解软件开源协议,以及如何选择协议

一、开源协议介绍 开源协议&#xff0c;是一个用来对软件二次分发进行限制和规范的条文规定&#xff0c;用户在使用他人开源代码的时候&#xff0c;可以根据作者选取的LICENSE获知自己能够有哪些权利去处理从原作者哪里拿到的代码。开源协议是开源社区运作的基石&#xff0c;在…

【读书笔记/深入理解K8S】集群网络

前言 上一章讲了集群控制器的一个大概的原理&#xff0c;这一章讲一下集群网络。网络是集群通信的载体&#xff0c;因为该书是阿里云团队出品的&#xff0c;所以也以阿里云的集群网络方案为例&#xff0c;其他云厂商的网络集群方案一般来说也大同小异。所以通过本章的学习&…