C++: C/C++内存管理

news2024/11/27 19:38:11

 前言

本篇博客将详细介绍C++的内存管理

💖 个人主页:熬夜写代码的小蔡

🖥 文章专栏:C++

若有问题 评论区见

🎉欢迎大家点赞👍收藏⭐文章 ​

d6b44a6e06316a12d6dec7f29fc29d7b.gif

ca618b2856ce45c78a02cc2a85b3b0f6.gif

一.C/C++内存分布

让我们先来看看下面的代码吧

int globalVar = 1;
static int staticGlobalVar = 1;
void Test()
{
static int staticVar = 1;
int localVar = 1;
int num1[10] = { 1, 2, 3, 4 };
char char2[] = "abcd";
const char* pChar3 = "abcd";
int* ptr1 = (int*)malloc(sizeof(int) * 4);
int* ptr2 = (int*)calloc(4, sizeof(int));
int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);
free(ptr1);
free(ptr3);
}
1. 选择题:
  选项: A.栈  B.堆  C.数据段(静态区)  D.代码段(常量区)
  globalVar在哪里?____  
  staticGlobalVar在哪里?____
  staticVar在哪里?____  
  localVar在哪里?____
  num1 在哪里?____
 
  char2在哪里?____
 
  *char2在哪里?___
  pChar3在哪里?____      
  *pChar3在哪里?____
  ptr1在哪里?____        
  *ptr1在哪里?____

来看一下解析吧

下面是后面6道题的图形解析

二.C++的内存管理方式 

C++可以使用c语言的内存管理方式,但是有时候会比较麻烦,所以在C++中提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理

2.1new/delete操作内置类型

void text1()
{
	//动态申请一个int类型的空间
	int* ptr1 = new int;
	//动态申请一个int类型的空间并初始化为0
	int* ptr2 = new int(10);
	动态申请是个int类型的空间
	int* ptr3 = new int[10];

	delete ptr1;
	delete ptr2;
	delete[] ptr3;
}

在上面的代码中,我们可以看到有delete也有delete[],所以在申请和释放单个元素的空间使用new和delete,申请和释放连续的空间时,使用new[]和delete[],也要注意配套使用

2.2new和delete操作自定义类型

class A
{
public:
	A(int a = 0)
	:_a(a)
	{
		cout << "A():" << this << endl;
	}
	~A()
	{
		cout << "~A()" << this << endl;
	}
private:
	int _a;
};
int main()
{
	// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间
	//还会调用构造函数和析构函数
	A* p1 = (A*)malloc(sizeof(A));
	A* p2 = new A(1);
	free(p1);
	delete p2;
	//内置类型也是一样的
	int* p3 = (int*)malloc(sizeof(int));
	int* p4 = new int;
	free(p3);
	delete(p4);

	A* p5 = (A*)malloc(sizeof(A) * 10);
	A* p6 = new A[10];
	free(p5);
	delete[] p6;

	return 0;
}

三.new和delete的实现原理

3.1内置类型

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

3.2自定义类型

new原理

1.调用operator new函数申请空间

2在申请的空间上执行构造函数,完成对象的构造

delete原理

1.在申请的空间上执行析构函数,完成对象中的资源的清理工作

2.调用operator new函数释放空间

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的区别

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.coloradmin.cn/o/2222686.html

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

相关文章

【植物识别系统】Python+人工智能+深度学习+卷积神经网络算法+TensorFlow+算法模型+Django网页界面平台

一、介绍 植物识别系统&#xff0c;使用Python作为主要编程语言开发&#xff0c;通过收集常见的6中植物树叶&#xff08;‘广玉兰’, ‘杜鹃’, ‘梧桐’, ‘樟叶’, ‘芭蕉’, ‘银杏’&#xff09;图片作为数据集&#xff0c;然后使用TensorFlow搭建ResNet50算法网络模型&am…

C++:模板的特化与分离编译

之前我们在介绍模板的时候仅仅是简单的介绍了模板的用法&#xff0c;本篇文章我们来详细的介绍下模板中比较重要的几个点。 一&#xff0c;非类型模板参数 我们之前的c中&#xff0c;会将经常使用的而又确保在我们程序的运行过程中值不会改变的值进行#define&#xff1a; #d…

Unity Apple Vision Pro 保姆级开发教程-环境配置、导入 PolySpatial 案例、程序发布到设备

视频教程 Unity 环境配置、导入 PolySpatial 案例、程序发布到设备 Unity Vision Pro 中文课堂教程地址&#xff1a; Unity3D Vision Pro 开发教程【保姆级】 | Unity 中文课堂 教程说明 这期教程我将介绍使用 Unity 开发 Apple Vision Pro 应用所需要的 Unity 环境配置&…

055_基于python摄影平台交流系统

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍&#xff1a;CodeMentor毕业设计领航者、全网关注者30W群落&#xff0c;InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者&#xff0c;博客领航之星、开发者头条/腾讯云/AW…

Android compose 重建流程1

前言 本文是笔者学习Compose是如何自动触发UI刷新的笔记,可能缺乏一定可读性和教导性.(建议阅读参考文献更具启发性) 使用以下BOM作为研究环境. composeBom "2024.04.01" androidx-compose-bom { group "androidx.compose", name "compose-bom…

实习冲刺Day2

算法题 反转链表 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}*…

AI大模型应用(3)开源框架Vanna: 利用RAG方法做Text2SQL任务

AI大模型应用(3)开源框架Vanna: 利用RAG方法做Text2SQL任务 RAG&#xff08;Retrieval-Augmented Generation&#xff0c;如下图所示&#xff09;检索增强生成&#xff0c;即大模型LLM在回答问题时&#xff0c;会先从大量的文档中检索出相关信息&#xff0c;然后基于这些检索出…

【LLaMA-Facrory】【模型评估】:代码能力评估——Qwen-Coder-7B 和 deepseek-coder-7b-base-v1.5

目录 序言 1 拉取 Qwen2.5-Coder-7B 模型 2 编写python测试模型 3 启动webui导入模型测试 4 模型评估 4.1 前期准备工作 4.2 Qwen2.5-Coder-7B 模型评估 数据说明 综合分析 4.3 deepseek-coder-7b-base-v1.5 模型评估 数据说明 综合分析 4.4 模型比较 1. 文本生成…

软件安全测试报告如何编写?CMA、CNAS软件安全测试机构推荐

随着软件产品的增多&#xff0c;产品安全成为软件企业留住用户的方法之一。安全测试是验证和检查软件安全的重要手段&#xff0c;而软件安全测试报告则是测试人员工作成果的最好体现&#xff0c;那么软件安全测试报告该如何编写呢?权威的CMA、CNAS软件安全测试机构又有哪些? …

WeMapEngine开发实战,创建你的第一个GIS项目

我们在《WeMapEngine可快速构建的GIS应用功能》一文中为你分享了WeMapEngine可快速建的GIS应用功能。 今天再为你分享基于WeMapEngine的开发实战&#xff0c;演示如何快速创建第一个GIS项目。 创建你的第一个GIS项目 现在&#xff0c;我们开始构建第一个项目。 在这个项目中…

emulator -version报错解决方案

使用android studio安装安卓环境之后&#xff0c;会发现emulator -version报如下错 [14960]:ERROR:android/android-emu/android/qt/qt_setup.cpp:28:Qt library not found at ..\emulator\lib64\qt\lib Could not launch C:\Users\litbai\..\emulator\qemu\windows-x86_64\qe…

【Java小白图文教程】-04-循环结构

精品专题&#xff1a; 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12789841.html?spm1001.20…

深入理解计算机系统--计算机系统漫游

对于一段最基础代码的文件hello.c&#xff0c;解释程序的运行 #include <stdio.h>int main() {printf ( "Hello, world\n") ;return 0; }1.1、信息就是位上下文 源程序是由值 0 和 1 组成的位&#xff08;比特&#xff09;序列&#xff0c;8 个位被组织成一组…

springboot048校园资料分享平台(论文+源码)_kaic

校园资料分享平台 摘要 随着信息互联网购物的飞速发展&#xff0c;国内放开了自媒体的政策&#xff0c;一般企业都开始开发属于自己内容分发平台的网站。本文介绍了校园资料分享平台的开发全过程。通过分析企业对于校园资料分享平台的需求&#xff0c;创建了一个计算机管理校园…

无人机的电池放电详解!

一、定义与表示方法 无人机的电池放电率是指电池在一定时间内放出其储存电能的能力&#xff0c;这一参数通常用C数来表示。C数越大&#xff0c;表示放电速率越快。 例如&#xff0c;一个2C的电池可以在1/2小时内放完其全部电量&#xff0c;而一个10C的电池则可以在1/10小时内…

喜讯!望繁信科技荣膺2022年中国超自动化先锋企业TOP20

36氪重磅发布「2022中国超自动化先锋企业」调研结果。凭借多年在流程挖掘领域过硬的技术实力和突出的产品创新力&#xff0c;望繁信科技在众多调研样本企业中脱颖而出&#xff0c;赢得了专家评委的充分认可&#xff0c;成功入选2022年中国超自动化先锋企业TOP20。 什么是超自动…

【书生大模型实战营】闯关任务1-入关岛

这里写自定义目录标题 第一关 L0G1000 Linux 基础知识 第一关 L0G1000 Linux 基础知识 SSH连接与端口映射并运行hello_world.py 关键截图&#xff1a;

502 错误码通常出现在什么场景?

服务器过载场景 高流量访问&#xff1a;当网站遇到突发的高流量情况&#xff0c;如热门产品促销活动、新闻热点事件导致网站访问量激增时&#xff0c;服务器可能会因承受过多请求而无法及时响应。例如&#xff0c;电商平台在 “双十一” 等购物节期间&#xff0c;大量用户同时…

Windows解决localhost拒绝了连接请求

最近&#xff0c;在开发前端Vue项目时&#xff0c;Vue项目启动成功&#xff0c;没有任何报错&#xff0c;服务控制台已出现APP访问地址&#xff0c;如下图所示。 览器打开后页面先是空白&#xff0c;然后过了一会儿显示无法访问此网站&#xff0c;localhost拒绝了我们的连接请…

WPF MVVM模式实现DataGrid编辑

本文是一个MVVM模式开发的基础教程&#xff0c;完全手写实现&#xff0c;未借助三方框架&#xff0c;适用于初学者 要实现DataGrid的编辑&#xff0c;步骤如下&#xff1a; 1、创建两个窗口&#xff0c;第一个窗口用于显示DataGrid&#xff0c; 布局如下&#xff1a; 这个界…