C++ new delete

news2024/11/25 2:24:08

可执行程序(进程) 的虚拟地址空间:

内核: 操作系统

栈区:函数的形参,非静态的局部变量,函数现场保护数据等等,栈是向下增长的。

共享库的内存映射区域:用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存,做进程间通信。

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

数据段: 存储全局数据和静态数据,分为.bss 和.data

代码段: 可执行的程序(机器指令) 和 常量数据


C的动态内存管理:

int main()
{
	int n = 10;
	int* ip = (int*)malloc(sizeof(int) * n);
	int* sp = (int*)calloc(n, sizeof(int));   //n*sizeof(int)
	ipa = (int*)realloc(ipa, sizeof(int) * n * 2);

	free(ipa);
	ipa = NULL;
	free(ipb);
	ipb = NULL;
	return 0;
}
int main()
{
	int* ipa = (int*)malloc(sizeof(int));  //C
	// bad_calloc //malloc realloc calloc  nullptr

	int* ips = new int(10);   //c++   
	//1.sizeof(int);  2.malloc   3.initvalue 
	//new会对申请的空间拿()的值初始化 malloc只能够申请空间
	//new 申请空间失败时  并不是返回一个空指针 
	//throw bad_calloc
	
	free(ipa); ipa = nullptr;   //malloc  把ipa指向的堆区空间还给系统
	delete ips; ips = nullptr;                 //new

}

ip是一个空指针吗?

 不是

 

malloc只管开辟内存(按字节开辟),不管初始化

new和delete,称作运算符

解析new delete

        C++中解决动态内存分配的方案是把创建一个对象所需要的操作都结合在一个称为new的运算符里。当用new创建一个对象时,它就在堆里为对象分配内存并调用构造函数完成初始化。

 

new后边直接指定类型,如int,在堆上开辟int类型的内存。
小括号里面指定初始值。
所以这里的new不用进行类型转换了。
new不仅可以做内存开辟,还可以做内存初始化操作

malloc开辟内存失败,是通过返回值和nullptr空指针做比较;

new开辟数组内存时是不能在小括号进行初始化的。
这样写,是堆上只负责开辟数组,数组的元素不初始化。

 这样写,是开辟的数组的所有元素都初始化为0

 释放数组内存

 

int main()
{
	int n = 10;
	cin >> n;
	int* ipa = (int*)malloc(sizeof(int) * n);
	int* ips = new int[n];  //数组的概念: 申请一组空间1.sizeof(int)*10;  2.malloc,  3.初始化 4.把申请的空间ips
	//怎么初始化
	free(ipa);
	ipa = nullptr;
	delete[]ips;
	ips = nullptr;
} 
int main()
{
	//1.按照关键字运算  new initvalue  delete
	//new的运算 1.按照关键字运算
	int n = 10;
	int* ipa = new int[n] {1, 2, 3, 4, 5, 6, 7};

	delete[]ipa;
	ipa = nullptr;
	//连续空间初始化{}
}
//2.转变成函数   ::operator new(); not initvalue malloc
//               ::operator delete();
int main()
{
	int n = 10;
	int* ipa = (int*)malloc(sizeof(int) * n);
	if (nullptr == ipa)
	{
		return 1;
	}
	int* ips = (int*)::operator new(sizeof(int) * n,nothrow);
	//  throw bad_calloc
	free(ipa); ipa = nullptr;
	::operator delete(ips); ips = nullptr;
}

 

 

 

 new 的函数方式的使用

 定位new   对已经申请的空间初始化initvalue;

 malloc 和new 的区别:

new不但能申请空间 还能对申请成功的空间初始化  malloc只能够申请空间;malloc申请空间失败返回空,new申请空间失败抛出异常(throw) ;    ::operator new()申请空间失败抛出异常(throw) ,其他与malloc一样

区别:
1、 new/delete 是C++中的运算符。 malloc / free 是函数
2、 malloc申请内存空间时,手动计算所需大小,new只需类型名,自动计算大小,3、malloc申请的内存空间不会初始化,new可以初始化:
4、 malloc的返回值为void*,接收时必须强转,new不需要:5、malloc申请内存空间失败时,返回的是NULL,使用时必须判空new申请内存空间失败时抛出异常,所以要有捕获异常处理程序

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

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

相关文章

四足机器人A1目标跟踪

四足机器人A1目标跟踪 前期准备工作1.安装TeamViewer2.将四足机器人所有线连接好3.将四足机器人调至运动模式 运行流程1.开机阶段2.运行阶段 效果展示代码配置 前期准备工作 1.安装TeamViewer 由于外接屏幕损坏,故四足机器人内部配置了TeamViewer,因此…

VM——编写脚本,TCP发送16进制字符串

1、参考: (1)​​​(246条消息) TCP中发送接收16进制数(16进制字符串与字节数组之间的转换)_tcp发送16进制字符串_start_continue的博客-CSDN博客 (2)(246条消息) C#byte String转换_c# byte转…

【网络编程二】UDP与TCP协议你学会了吗~

目录 🌟需要知道 1、什么是网络编程? 2、怎么进行网络编程? 3、TCP与UDP的区别? (面试题) 🌟一、UDP 🌈1、UDP数据报套接字编程 🌈2、实现一个简单的UDP回显服务…

java服务端如何接入WebSocket?

日常工作中,我们都是使用http请求,来进行前后交互,那么我们也会有使用websocket来进行前后交互的时候,那么它俩有什么区别呢? http和websocket区别 WebSocket是双向通信协议,模拟Socket协议,可…

商场内如何导航?有没有在商场用的导航?

商场内如何导航?大家可能都有这种感觉,在商场里逛街时,好像经常容易迷路,无论是找出口还是找电梯,总会把自己搞得晕头转向,“每次逛完商场都要给自己预留半小时找车子,也是醉了。”“在商场迷路…

XR云新未来 | 弹性算力赋能可交互、沉浸式商业实践

据XR市场研究报告显示,全球XR市场规模不断扩大,于2020年已超过100亿美元,预计到2025年规模将达到数百亿美元。XR技术广泛应用于娱乐、教育和企业领域,随着技术的进步,高分辨率显示、实时渲染和眼动追踪等创新技术的应用…

Ubantu docker学习笔记(十一)k8s基本操作

文章目录 一、K8s介绍二、容器编排2.1 部署应用2.2 了解应用2.3 公开暴露应用2.4 扩缩应用2.4 滚动更新 三、Kubernetes 对象 相信大家在前面的安装过程中,我们的k8s已经完成了一个超级具体的安装【是不是还是有点难度】,今天我们就在前面已经安装好的基…

消防安全知识答题活动小程序v4.3.0

消防安全知识答题活动小程序v4.3.0 v4.3.0 1)实现答题倒计时功能 如果让你给一款答题小程序产品制定一个技术方案,比如实现答题倒计时功能,你会怎么做。 通常,我们对于倒计时的普遍认知是设置一个定时器去实现的,在…

0基础学习VR全景平台篇第32章:场景功能-嵌入文字

大家好,欢迎观看蛙色VR官方系列——后台使用课程! 本期为大家带来蛙色VR平台,场景管理模块-嵌入功能文字模块! 功能位置示意 一、本功能将用在哪里? 嵌入功能可对VR全景作品嵌入【图片】【视频】【文字】【标尺】四…

Android平台OpenCV入门

一、导入OpenCV 别忘记把libopencv_java3.so添加进来。 二、初始化 OpenCVLoader.initDebug();三、常用方法 1. CvType 数据类型 以CV_64FC2为例,64指64位,F指浮点数,C指通道,2为2通道。 数值具体类型取值范围CV_8U8 位无符…

5.30-cloud support -learning

文章目录 namespaceaccessNSG(network security group )UDR (User-Defined Routing)Azure Firewall namespace Namespaces are defined at the Kubernetes cluster level, so each namespace is unique throughout the cluster. I…

C语言笔记 | 数据结构入门指南

文章目录 0x00 前言 0x01 百鸡百钱 0x02 借书方案知多少 0x03 持续更新 0x04 参考文献 0x05 总结 0x00 前言 写这篇《C语言笔记 | 数据结构入门指南》主要是为了帮助更多的编程爱好者打开数据结构的大门,同时也是为了自我编程水平能力的提升。在深奥的数据结构…

正交实验进行方差分析

一、案例介绍 想要从某种草药中提取植物酚,利用专业知识发现可能有三个条件会影响植物酚的提取,每个条件有三个水平,想要通过实验,寻找植物酚的最佳提取条件,其中提取植物酚的参考标准为植物酚的含量(案例…

在线原型设计是什么?8款在线原型工具助你高效设计!

原型设计是产品经理、设计师和开发工程师沟通最初的产品设想的重要工具。 在线原型通过云端的方式具象化地呈现产品内容、结构及粗略的布局,说明用户将如何与产品进行交互,搭建了产品经理、设计师和开发工程师沟通的桥梁,帮助产研团队减少信…

什么是深度数据包检测 (DPI)

随着混合工作成为生活的正常部分,新技术每天都在使用,同时总是通过网络传输数据的山体滑坡。通过高正常运行时间、快速解决问题和富有洞察力的情报提供无缝的用户体验至关重要。为此,对网络进行端到端监控非常重要。 深度数据包检测是一种用…

技术招聘漫谈 | 正在招Golang工程师的你,赶快收藏这份识人秘籍!

各位技术面试官,欢迎来到新一期的技术招聘漫谈专栏。 在前两期的专栏中,我们解析了前端工程师(点击此处回顾)以及 Java 工程师(点击此处回顾)这两个常见技术岗位的招聘技巧。 今天,我们想把目…

了解和使用 Docker 镜像仓库

前言 在上文 《了解和使用 Docker》 之后,反响不错,也上了热榜。本来是想直接整理一下容器编排工具 Docker Swarm 和 K8s 博文的,但是半路杀出了这个活动😂,为表敬意,先参与一波吧。 本文主要介绍一下容…

【MyBatis】MyBatis中#{}与${}的区别是什么?

文章目录 前言一、彻底理解SQL注入二、关于 # { }三、关于$ { }四、Mybatis中#{}与${}的区别五、代码案例使用#{}案例使用$ {}案例 前言 在开发中使用Mybatis经常使用到#{}与${},二者区别是?来总结一下。 在mybatis中动态 sql 是其主要特性之一&#x…

什么是现代化智慧型档案馆

近日,智慧档案馆建设的新闻热度不断攀升,你知道智慧档案馆是什么吗? ​智慧档案馆是指运用现代信息技术手段,对传统档案馆进行数字化转型,实现档案数字化存储、智能化检索和共享服务。通过数字化转型,不仅可…

< 免费体验ChatGPT:免费且好用,不用使用 “ 魔法 ”,一款功能强大且轻便的插件!webTab! >

免费且好用,不用使用 “ 魔法 ”,一款功能强大且轻便的插件!webTab! 👉 前言👉 功能演示图👉 使用经验分享👉 如何安装webTab插件呢?往期内容 💨 tips&#x…