【1++的C++初阶】之内存管理

news2024/11/20 8:31:25

👍作者主页:进击的1++
🤩 专栏链接:【1++的C++初阶】

文章目录

  • 一,C/C++的内存分布
  • 二,malloc,realloc,calloc的区别
  • 三,C++的内存管理- -new和delete
    • 初识new和delete
    • new和delete操作自定义类型
    • 深度剖析new与delete
    • 定位new
  • 四,new/delete与malloc/free的区别

一,C/C++的内存分布

在这里插入图片描述
如上图所示,C/C++程序在运行时占用的内存主要是这几部分

 1.  栈:函数栈帧是建立在栈中的,所以在栈中会存储一些非静态局部变量,函数参数,返回值等。
 2. 堆:我们动态申请的内存就在堆中。
 3. 内存映射段:后面的文章会涉及,暂时不是很了解。
 4. 数据段:全局变量,static修饰的变量,函数等。
 5. 代码段:const修饰的只读常量,可执行程序等。

二,malloc,realloc,calloc的区别

我们首先来说他们各自的作用与用法:

  1. malloc:malloc是C语言中用来动态申请内存的函数,它能够申请所输入参数大小的空间,单位为字节,并且malloc的类型为void*,因此,在使用时要进行强制类型转换。
  2. calloc:calloc和malloc的功能差不多,区别就是,在申请内存的同时,能够将内存初始化为0。
  3. realloc:reallocation主要进行扩容,其有两种扩容方式,一是,在原来申请内存的后面扩容,二是,由于其后面的内存不够,另找一块地方,将原来申请内存中的内容拷贝到新的申请的内存中。
  4. 它们申请失败都会返回NULL,因此要加断言或判断语句来进行判断是否申请成功。

三,C++的内存管理- -new和delete

初识new和delete

我们来看以下代码:

void Test()
{
	int* ptr1 = new int;//申请一个int类型的空间
	int* ptr2 = new int[3]{1,2,3};//申请三个int类型的空间,并将其分别初始化为1,2,3
	int* ptr3 = new int(10);//申请一个int类型的空间,并将其初始化为10
	
}
int main()
{
	Test();
	return 0;
}

其运行结果如下图:
在这里9插入图片描述
以上就是new的几种用法,要注意的是,在第二种用法中,对开辟的空间要全部初始化,不能初始化部分。

再来看下面的代码:

void Test()
{
	int* ptr1 = new int;
	int* ptr2 = new int[3]{1,2,3};
	int* ptr3 = new int(10);
	delete ptr1;
	//delete[] ptr2;
	delete ptr2;
	delete ptr3;
}
int main()
{
	Test();
	return 0;
}

运行结果如下:
在这里插入图片描述
通过上述结果,我们发现new 要与delete搭配,当要释放申请了多个对象的连续空间时,就必须用delete [] xxx来进行释放。
也就是new [] 要与delete [] 搭配。

new和delete操作自定义类型

我们来看下面这段代码:

class Date
{
public:
	Date(int year = 2023, int month = 5, int day = 3)
		:_year(year)
		, _month(month)
		, _day(day)

	{
		cout << "Date()" << endl;
	}

	~Date()
	{
		cout << "~Date()" << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

void Test2()
{
	Date* p1 = (Date*)malloc(sizeof(Date));
	Date* p2 = new Date(2022,5,18);
	//Date* p3 = new Date[3];
	free(p1);
	delete p2;
	//delete[] p3;
}

运行结果如下:
在这里插入图片描述
将p2屏蔽后:
在这里插入图片描述
通过观察上述两张运行结果图,我们发现,使用new和delete编译器会自己调用其构造与析构函数,而使用malloc与free则不会。而对于内置类型,则几乎没区别。

深度剖析new与delete

我们将上述代码的汇编指令调出来,如下图:
在这里插入图片描述

在图中我们可以清楚的观察到,new先是调用了operator new然后调用了其构造函数。delete也是类似先调用其析构,再调用operator delete。那么什么是operator new和opertaor delete呢?

operator new 和operator delete是系统提供的全局函数与前面所学的类重载的函数是不同的;new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。
operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请空间失败,尝试执行空间不足应对措施,如果应对措施用户设置了,则继续申请,否则抛异常。malloc申请失败返回NULL,而new会抛异常。
operator delete: 该函数最终是通过free来释放空间的。

定位new

什么叫定位new?定位new就是已分配的原始内存空间中调用构造函数初始化一个对象。

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

定位new的简单使用如下代码:

void Test2()
{
	Date* p1 = (Date*)malloc(sizeof(Date));
	//Date* p2 = new Date(2022,5,18);
	//Date* p3 = new Date[3];
	new(p1)Date;//定位new显式调用构造函数
	 p1->~Date();//显式调用析构函数
	free(p1);
	//delete p2;
	//delete[] p3;
}

运行结果如下:
在这里插入图片描述

四,new/delete与malloc/free的区别

  1. new delete是操作符而malloc,free是函数。
  2. new可以就行初始化而malloc不可以。
  3. 对于自定义类型new,delete会调用构造与析构函数,而malloc,free不会。
  4. new申请空间失败后会抛异常而malloc会返回NULL.
  5. new相较于malloc用起来更加方便。

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

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

相关文章

宝塔面板webhook 使用教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 背景1、介绍一下Webhook2、使用步骤1.安装git2.安装WebHook3.添加WebHook4.配置git 钩子 &#xff08;码云示例&#xff09;5.私有项目还需要做以下操作 背景 最近…

C语言算法--桶排序

1-什么是桶排序法 什么是桶排序法&#xff1f;其实说白了就是把需要排列的元素分到不同的桶中&#xff0c;然后我们对这些桶里的元素进行排序的一种方式&#xff0c;然后我们在根据桶的顺序进行元素的合并。&#xff08;不过前提是要确定桶的数量以及大小&#xff09; 按照稍…

[数字图像处理]第四章 频率域滤波

文章目录 第四章 频率域滤波笔记&#xff1a;4.1 背景4.1.1 傅里叶级数和变换简史 4.2 基本概念4.2.1 复数4.2.2 傅里叶级数4.2.3 冲激及其取样特性4.2.5 卷积 4.3 取样和取样函数的傅里叶变换4.3.1 取样4.3.2 取样函数的傅里叶变换4.3.3 取样定理4.3.4 混淆4.3.5 有取样后的数…

微服务—Redis实用篇-黑马头条项目-附近商户功能(使用GEO实现)

微服务—Redis实用篇-黑马头条项目-附近商户功能(使用GEO实现) 1、附近商户 1.1、附近商户-GEO数据结构的基本用法 GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本中加入了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;帮助我们根据经纬…

【C++】设计模式

目录 设计模式概述 单例模式 饿汉模式 懒汉模式 工厂模式 简单工厂模式 工厂方法模式 抽象工厂模式 观察者模式 设计模式概述 设计模式&#xff1a;一套反复被人使用、多数人知晓的、经过分类编目的代码设计经验的总结。一种固定的写代码的思维逻辑方式&#xff0c;一…

chatgpt赋能Python-python3_8降级3_7

Python 3.8降级至3.7&#xff1a;为什么需要这么做&#xff1f; Python 3.8是Python编程语言的最新版本&#xff0c;拥有许多令人兴奋的新功能和改进。但是&#xff0c;在某些情况下&#xff0c;您可能需要降级Python版本&#xff0c;特别是当某些库或框架不兼容Python 3.8时。…

AI绘图实战(十一):将纸质儿童画修改为电子照片/3D Openpose插件使用 | Stable Diffusion成为设计师生产力工具

S&#xff1a;AI能取代设计师么&#xff1f; I &#xff1a;至少在设计行业&#xff0c;目前AI扮演的主要角色还是超级工具&#xff0c;要顶替&#xff1f;除非甲方对设计效果无所畏惧~~ 预先学习&#xff1a; 安装及其问题解决参考&#xff1a;《Windows安装Stable Diffusion …

在vscode调试c++代码报错

在vscode调试c代码报错 一、我在vscode调试c代码,报错:错误原因&#xff1a;解决办法: 二、上面的问题解决之后&#xff0c;报错问题变了错误原因&#xff1a;路径中的“随笔”是中文&#xff0c;路径中不能出现中文&#xff01;解决办法&#xff1a;将路径中的“随便”改成英文…

『python爬虫』25. 接入超级鹰处理验证码(保姆级图文)

目录 1. 验证码平台的使用1.1 下载demo程序1.2 注册后生成软件id1.3 查验证码类型1.4 demo文件中填写我们的用户参数测试效果 2. 分析超级鹰的登录3. 完整代码总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 1.…

Golang每日一练(leetDay0070) 移除链表元素、计数质数

目录 203. 移除链表元素 Remove Linked-list Elements &#x1f31f; 204. 计数质数 Count Primes &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每…

chatgpt赋能Python-python3_8安装pyqt5

Python3.8安装PyQt5教程 介绍PyQt5 PyQt5是一个用于创建桌面应用程序的Python模块。它利用Qt框架的本地GUI应用程序开发工具包&#xff0c;为Python开发者提供了一种方便的方式来创建跨平台的应用程序。PyQt5支持在Windows&#xff0c;MacOS和Linux等主要桌面操作系统上构建G…

ChatGPT api 接口调用测试

参考文档&#xff1a; https://platform.openai.com/docs/quickstart/build-your-application示例说明&#xff1a; 本示例会生成一个简单的ChatGPT api接口调用server程序&#xff0c;该程序可以给用户输入的宠物类别为宠物取三个名字。打开网页后&#xff0c;会看到用户输入…

chatgpt赋能Python-python3_8_5怎么保存

Python 3.8.5&#xff1a;什么是它&#xff0c;为什么它重要&#xff0c;以及如何安装和保存&#xff1f; Python是当今世界上最受欢迎的编程语言之一。Python 3.8.5是该语言的最新版本&#xff0c;它引入了一些重要的改进和新特性。这篇文章将介绍Python 3.8.5并向您展示如何…

macOS Ventura 13.4 (22F66) Boot ISO 原版可引导镜像下载

本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Windows 和 Linux 中创建可引导介质。 macOS Ventura 13.4 包括以下增强功…

[创业之路-68]:科创板上市公司符合哪些条件

上交所发布《关于在上交所设立科创板并试点注册制相关情况答记者问》。上交所将认真落实习指示&#xff0c;在证监会的指导下&#xff0c;积极研究制订科创板和注册制试点方案&#xff0c;向市场征求意见并履行报批程序后实施。科创板是独立于现有主板市场的新设板块&#xff0…

chatgpt赋能Python-python3_8_2怎么用

Python 3.8.2 指南&#xff1a;介绍、使用和结论 Python 3.8.2 是近期发布的一个重大更新&#xff0c;它提供了很多新的特性和改进&#xff0c;使得 Python 编程更加高效、方便和强大。本文将向您介绍 Python 3.8.2 的主要特性和使用方法&#xff0c;帮助您更好的利用 Python …

【前后端分离博客】学习笔记05 --- canal

一、概述 使用canal rabbitMQ 实现 MySQL 和 Elasticsearch 的数据同步 图解&#xff1a; 流程如下&#xff1a; 给mysql开启binlog功能 mysql完成增、删、改操作都会记录在binlog中 canal监听binlog变化并发送消息到MQ&#xff0c;项目接收消息并实时更新elasticsearch中…

IS215UCVEH2AE speed tronic涡轮控制PCB板

IS215UCVEH2AETPMC815-11IS215UCVEM08B IS215UCVEH2AE是通用电气公司Mark VI Speedtronic控制系统的一个组件。该板的功能相当于VME控制卡。VME卡架是Mark VI的标准架&#xff0c;有13或21槽架可供选择。 IS215UCVEH2AE是一个带有附加前面板的矩形板。面板顶部和底部有一个固…

震惊——某白帽破解zabbix系统,实现命令执行,最终获取shell

如果你坚持了自己的梦想&#xff0c;全世界都会为你让路。 一、漏洞说明 zabbix&#xff08;[zbiks]&#xff09;是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案&#xff08;百度百科定义&#xff09;。很多Zabbix的admin口令使用了初始账号&…

【学习日记2023.5.17】之 项目入门介绍_YApi_Swagger

文章目录 1. 项目入门1.1 软件开发整体介绍1.2 项目介绍1.3 开发环境搭建1.3.1 前端环境搭建1.3.2 后端环境搭建1.3.3 登录功能完善1.3.4 前后端分离开发流程 1.4 导入接口文档1.5 Swagger介绍使用方式Swagger常用注解 1.6 注意事项 1. 项目入门 1.1 软件开发整体介绍 软件开发…