c++程序内存区域划分

news2025/1/13 2:36:55

目录

内存区域划分 

例题:

 malloc,calloc和realloc的区别

new和delete

 申请空间并初始化

申请多个空间:

new和delete对于自定义类型的处理:

 new和delete一定要匹配

new和malloc以及delete和free的区别

 抛异常的使用方法:

 new的底层


内存区域划分 

 

注意:我们编写的代码是存在于计算机文件当中的,计算机文件属于硬盘而不属于内存,所以代码并不属于以上的内存划分 

例题:

 

我们对char2和*char2以及pChar3和*pChar3进行理解:

 

char2的字符串是经过静态区的"abcd"进行拷贝拷贝到栈上去。

pChar3因为被const修饰,所以对应的字符串在常量区,pChar3指向该区域。

char2和pChar3都是在栈上创建的指针,属于栈。

*char2表示数组首元素,也就是'a'

*pChar3表示指向常量区的常量字符串"abcd"的地址。

 malloc,calloc和realloc的区别

malloc表示申请空间,calloc表示申请空间并且初始化,而realloc表示扩容或缩容。 

这里不需要对ptr2进行释放:

答:在使用realloc时,会分为原地扩容或异地扩容,原地扩容之后ptr3就是原来的ptr2,异地扩容时,realloc函数还会将ptr2指向的空间进行释放。

new和delete

new和delete类比c语言的malloc和free,起到申请空间和释放空间的作用。

int main()
{
	int*p = new int;
	delete p;
}

申请一个整型的空间,p指针指向该空间。

delete表示释放该空间。

我们在new的时候,并不会对该空间进行初始化。

 申请空间并初始化

int main()
{
	int*p = new int(0);
	delete p;
	return 0;
}

表示申请空间并把该空间对应的值初始化为0.

申请多个空间:

	int*p1 = new int[10];
	delete[] p1;

申请多个空间并且初始化:

int*p1 = new int[10]{1, 2, 3, 4};
	delete[] p1;

new和delete对于内置类型的处理,和malloc,free没有什么区别。

new和delete对于自定义类型的处理:

class A
{
public:
	A(int a = 0)
		:_a(a)
	{
		cout << "A():" << this << endl;
	}
	~A()
	{
		cout << "~A():" << this << endl;
	}
private:
	int _a;
};
class A
{
public:
	A(int a = 0)
		:_a(a)
	{
		cout << "A()" << this << endl;
	}
	~A()
	{
		cout << "~A():" << this << endl;
	}
private:
	int _a;
};
int main()
{
	/*int*p = new int(0);
	delete p;*/
	/*int* p1 = new int[10]{1,2,3,4,5,6,7,8,9,10};
	delete[] p1;*/
	A*p1 = new A;
	delete p1;
	return 0;
}

对于自定义类型,new可以调用其默认构造,delete可以调用其默认析构。

 new和delete一定要匹配

错配可能产生我问题。

new和malloc以及delete和free的区别

int main()
{
	while (1)
	{
		int*p1 = (int*)malloc(1024);
		if (p1)
		{
			cout << p1 << endl;
		}
		else
		{
			cout << "申请失败" << endl;
			break;
		}
	}
}

malloc不断的申请内存,最终会申请失败,申请成功时返回该指针,申请失败时返回空指针。

 当我们使用new来进行替代时:

int main()
{
	while (1)
	{
		int*p1 = new int[102400];
		if (p1)
		{
			cout << p1 << endl;
		}
		else
		{
			cout << "申请失败" << endl;
			break;
		}
	}
}

我们发现:new成功时返回该指针,new失败时不返回空指针。

 总结:malloc申请成功,返回该指针,申请失败,返回空指针。

new申请成功,返回该指针,申请失败,抛异常。

 

int main()
{
	try{

		while (1)
		{
			int*p1 = new int[102400];
			if (p1)
			{
				cout << p1 << endl;
			}
			else
			{
				cout << "申请失败" << endl;
				break;
			}
		}
	}
	catch (exception& e)
	{
		cout << e.what() << endl;
	}
	return 0;
}

 抛异常的使用方法:

void test()
{
	while (1)
	{
		int*p1 = new int[102400];
		if (p1)
		{
			cout << p1 << endl;
		}
		else
		{
			cout << "申请失败" << endl;
			break;
		}
	}
}
int main()
{
	try{
		test();
	}
	catch (exception& e)
	{
		cout << e.what() << endl;
	}
}

申请失败是自动去抛异常。

 new的底层

总结:

注意:并不是运算符重载,因为没有自定义类型的参数。

 

new就相当于是malloc的封装,不同点在于申请内存失败时抛异常。

 对于operator new的使用:

#include<iostream>
using namespace std;



void test()
{
	while (1)
	{
		int*p1 = (int*)operator new(102400);
		if (p1)
		{
			cout << p1 << endl;
		}
		else
		{
			cout << "申请失败" << endl;
			break;
		}
	}
}
int main()
{
	try{
		test();
	}
	catch (exception& e)
	{
		cout << e.what() << endl;
	}
}

operator new的使用方法和malloc类似。

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

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

相关文章

ubuntu 开启笔记本摄像头并修复画面颠倒问题

文章目录 基本环境状况&#xff1a; 没找到摄像头检查 opencv检查系统应用 键盘右侧&#xff0c;硬件层面开启摄像头画面镜像问题 基本环境 笔记本&#xff1a; 联想拯救者 系统&#xff1a; ubuntu 22.04 状况&#xff1a; 没找到摄像头 检查 opencv 使用 cv::VideoCaptu…

vue elemnt封装文件上传 +根据后台接口来上传文件

1.创建一个新的子页面,放文件上传 <template> <div><el-uploadaction"https://jsonplaceholder.typicode.com/posts/"list-type"picture-card":on-preview"handlePictureCardPreview":on-remove"handleRemove">&l…

7.网络原理之TCP_IP

文章目录 1.网络基础1.1认识IP地址1.2子网掩码1.3认识MAC地址1.4一跳一跳的网络数据传输1.5总结IP地址和MAC地址1.6网络设备及相关技术1.6.1集线器&#xff1a;转发所有端口1.6.2交换机&#xff1a;MAC地址转换表转发对应端口1.6.3主机&#xff1a;网络分层从上到下封装1.6.4主…

交换机技术综述(第十一课)

交换机技术综述基础 1 Vlan技术的学习 三大接口 Vlan技术实操(第四课)_IHOPEDREAM的博客-CSDN博客https://drean.blog.csdn.net/article/details/132455765?spm=1001.2014.3001.5502

论文阅读:DisCO Portrait Distortion Correction with Perspective-Aware 3D GANs

论文阅读&#xff1a;DisCO Portrait Distortion Correction with Perspective-Aware 3D GANs 今天介绍一篇比较有趣的文章&#xff0c;通过 3D GAN inversion 来解决成像的透视畸变问题 Abstract 文章的摘要&#xff0c;一开始就介绍说&#xff0c;近距离成像的时候&#x…

【3维视觉】20230922_网格编码最新进展

网格编码技术研究进展 1. VDMC编码技术 1.1 VDMC介绍 1.1.1 编码对象 具有时变拓扑的动态网格 1.1.2 技术细节 VDMC的编码和解码过程的高层框图如图2所示[4][5]。预处理模块提供了更好的率失真( Rate-Distortion&#xff0c;RD )性能&#xff0c;支持可伸缩解码和渐进传输…

Minecraft 1.20.x Forge模组开发 06.建筑生成

我们本次尝试在主世界生成一个自定义的建筑。 效果展示 效果展示 效果展示 由于版本更新缘故,1.20的建筑生成将不涉及任何Java包的代码编写,只需要在数据包中对建筑生成进行自定义。 1.首先我们要使用游戏中的结构方块制作一个建筑,结构方块使用教程参考1.16.5自定义建筑生…

记一次hyperf框架封装swoole自定义进程

背景 公司准备引入swoole和rabbitmq来处理公司业务。因此&#xff0c;我引入hyperf框架&#xff0c;想用swoole的多进程来实现。 自定义启动服务封装 <?php /*** 进程启动服务【manager】*/ declare(strict_types1);namespace App\Command;use Swoole; use Swoole\Proce…

软考知识产权基础知识

商标权可以根据需要无限延长 根据《商标法》的规定&#xff0c;商标的有效期为10年&#xff0c;自商标注册之日起计算。有效期届满后&#xff0c;可以递交商标续展申请。每次续展的有效期为10年。但是&#xff0c;商标续展仅限于最后一年有效期也就是期满前六个月内提交申请。…

服务注册发现_actuator微服务信息完善

SpringCloud体系里的&#xff0c;服务实体向eureka注册时&#xff0c;注册名默认是IP名:应用名:应用端口名。 问题&#xff1a; 自定义服务在Eureka上的实例名怎么弄呢 在服务提供者pom中配置Actuator依赖 <!-- actuator监控信息完善 --> <dependency><groupId…

011_第一代软件开发(三)

第一代软件开发(三) 文章目录 第一代软件开发(三)项目介绍带下知识点系统日志滤波器陷波滤波器带通滤波器 打印初始化调用打印机打印文件保存到PDF 总结一下 关键字&#xff1a; Qt、 Qml、 日志、 打印、 滤波器 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这…

排序算法:非比较排序(计数排序)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关排序算法的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通…

2018 国际AIOps挑战赛单指标数据集分析

关于数据集 2018年国际AIOps 由中国建设银行、清华大学以及必示科技公司联合举办&#xff0c;尽管已经过去了这么长时间&#xff0c;其提供的比赛数据依然被用于智能运维相关算法的研究。这里我们对此数据集做简单的分析&#xff0c;把一些常用的数据分析方法在这里进行略微地…

Spring面试题13:Spring中ApplicationContext实现有哪些?Bean工厂和Applicationcontext有什么区别

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring中ApplicationContext实现有哪些? 在Spring框架中,有以下几种ApplicationContext的实现: ClassPathXmlApplicationContext:从类路径下的…

基于springboot消防员招录系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

​Segment-and-Track Anything——通用智能视频分割、跟踪、编辑算法解读与源码部署

一、 万物分割 随着Meta发布的Segment Anything Model (万物分割)的论文并开源了相关的算法&#xff0c;我们可以从中看到&#xff0c;SAM与GPT-4类似&#xff0c;这篇论文的目标是&#xff08;零样本&#xff09;分割一切&#xff0c;将自然语言处理&#xff08;NLP&#xff…

【数据结构】二叉排序树;平衡二叉树的知识点学习总结

目录 1、二叉排序树 1.1 定义 1.2 查找操作 1.3 插入操作 1.4 删除操作 1.5 C语言实现二叉排序树的基本操作 2、平衡二叉树的知识点总结 2.1 定义 2.2 插入操作 2.3 调整“不平衡” 2.4 删除操作 1、二叉排序树 1.1 定义 二叉排序树&#xff08;Binary Search …

云计算与大数据——部署Hadoop集群并运行MapReduce集群(超级详细!)

云计算与大数据——部署Hadoop集群并运行MapReduce集群(超级详细&#xff01;) Linux搭建Hadoop集群(CentOS7hadoop3.2.0JDK1.8Mapreduce完全分布式集群) 本文章所用到的版本号&#xff1a; CentOS7 Hadoop3.2.0 JDK1.8 基本概念及重要性 很多小伙伴部署集群用hadoop用mapr…

C++设计模式_06_Decorator 装饰模式

本篇将会介绍Decorator 装饰模式&#xff0c;它是属于一个新的类别&#xff0c;按照C设计模式_03_模板方法Template Method中介绍的划分为“单一职责”模式。 “单一职责”模式讲的是在软件组件的设计中&#xff0c;如果责任划分的不清晰&#xff0c;使用继承得到的结果往往是随…

HT for Web (Hightopo) 使用心得(2)- 2D 图纸、节点、连线 与基本动画

概括来说&#xff0c;用 HT for Web 做可视化主要分为两部分&#xff0c;也就是 2D 和 3D。这两部分需要单独创建。在它们被创建完成后&#xff0c;我们再把它们集成到一起。 HT for Web 的 2D 部分主要是指 ht.graph.GraphView (简称 GraphView&#xff0c;也就是 2D 图纸)。…