C/C++内存管理相关知识点

news2025/1/12 18:14:45

1.内存分布

C/C++将内存大体上分为四个区域:栈区、堆区、静态区(数据段)、常量区(代码段)。

栈区:用来存储函数调用时的临时信息的结构,存放为运行时函数分配的局部变量、函数参数、返回数据、返回地址等。

堆区:程序员自己使用malloc或new自己申请出来存的地方。(动态内存分配)

静态区: static修饰的数据,全局数据,存放的位置。

常量区:不会改变的常量,存在这里。


看下面一段代码,回答问题:

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);
}

看上面一段代码,请回答如下:

在这里插入图片描述
在这里插入图片描述

2. new/delete关键字

2.1 操作内置类型

int main()
{

	//动态申请一个int 类型的空间
	int* ptr1 = new int;
	delete ptr1;			//释放ptr1
	
	// 动态申请一个int 类型的空间,并初始化为 5
	int* ptr2 = new int(5);
	delete ptr2;		   //释放ptr2

	// 动态申请5个int 类型的空间
	int* ptr3 = new int[5];
	delete[] ptr3;         // 释放ptr3,注意怎么new的怎么delete

	 动态申请5个int 类型的空间,并初始化
	int* ptr4 = new int[5]{ 1,2,3 };
	delete[] ptr4;		   // 释放ptr4,注意怎么new的怎么delete

	return 0;
}

**注意:new 对应 delete,new [] 对应 delete [] 。**不可用错。

操作自定义类型

new 和 delete 除了申请和释放空间外,会自动调用构造函数和析构函数。

class A
{
public:
	A(int a = 0)
	{
		cout << "A()" << endl;
	}
	~A()
	{
		cout << "~A()" << endl;
	}

private:
	int _day;
	int _year;
	int _month;
};

int main()
{
	A* p1 = new A(1);  //一次构造
	delete p1;			//一次析构

	A* p2 = new A[5];  // 五次构造
	delete[] p2;       //五次析构

	

	return 0;
}

3. opeartor new 与 operator delete函数

newdelete是 用户进行动态内存申请和释放的操作符,operator newoperator delete 是系统提供的全局函数,new在底层调用 operator new 全局函数来申请空间,delete在底层通过 operator delete 全局函数来释放空间。

其中:
operator new:该函数实际通过malloc来申请空间,申请成功直接返回;失败时,尝试执行空间不足应对策略,如果用户对该措施设置了,继续申请空间,否则抛异常。

operator delete:该函数最终是通过free()来释放空间的。


在这里插入图片描述
通过该定义也可以看出,free()其实也是一个重命名,真正的函数名是后面的。

4. new 和 delete 原理

4.1 内置类型

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

4.2 自定义类型

  • new的原理
    1.调用operator new 申请空间
    2.在申请的空间上执行构造函数,完成对象的构造。

  • delete 原理
    1.在空间上执行析构函数,完成对象中资源的清理工作
    2.调用operator delete函数释放对象的空间

  • newT[N] 原理
    1.调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请。
    2.在申请的空间上执行N次构造函数

  • delete[] 原理
    1.在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理。
    2.调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间

如下例子总结:
在这里插入图片描述

5.定位new表达式(placement-new)

定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。

使用语法:
new (place_address) type 或者new (place_address) type(initializer-list)
place_address必须是一个指针,initializer-list是类型的初始化列表。


new(p1)A;    //如果A的构造函数有参数,此处需要传参
nwe(p2)A(10);  // 初始化参数为10

6. malloc/free 和 new/delete的区别

共同点:
都是从堆上申请空间,并需要手动释放。

不同点:

  1. malloc和free是函数,new和delete是关键字。
  2. malloc申请的空间不会初始化,new可以调用构造函数完成初始化。
  3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后面跟上空间的类型即可,如果是多个对象,[]中指定个数即可。
  4. malloc返回值是void*,在使用时必须强转,new不需要,因为new后面跟的是空间类型。
  5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是需要捕获异常。
  6. 申请自定义类型时,malloc/free 只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成对象空间中资源的清理。

7. 内存泄漏

相关知识后续会继续补充。。。

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

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

相关文章

解码癌症预测的密码:可解释性机器学习算法SHAP揭示XGBoost模型的预测机制

一、引言 癌症是全球范围内健康领域的一大挑战&#xff0c;早期预测和诊断对于提高治疗效果和生存率至关重要。机器学习在癌症预测中发挥了重要作用&#xff0c;可以从临床数据中学习并构建癌症预测模型&#xff0c;帮助医生进行早期检测和干预&#xff0c;提高患者的生活质量和…

kubernetes集群证书过期启动失败问题解决方法

1、问题现象 执行kubectl命令异常报告 [rootk8s-master1 ~]# kubectl get node The connection to the server 192.168.227.131:6443 was refused - did you specify the right host or port? [rootk8s-master1 ~]# 查看etcd的日志&#xff0c;报错信息如下 {"level&…

服务器性能测试监控平台export+prometheus(普罗米修斯)+grafana搭建

1. export 数据采集工具 简介&#xff1a; export是prometheus是的数据采集组件的总称&#xff0c;它可以将采集到的数据转为prometheus支持的格式 node_export: 用来监控服务器硬件资源的采集器&#xff0c;端口号为9100mysql_export: 用来监控mysql数据库资源的采集器&…

【Java 基础篇】Java线程:volatile关键字与原子操作详解

在多线程编程中&#xff0c;确保线程之间的可见性和数据一致性是非常重要的。Java中提供了volatile关键字和原子操作机制&#xff0c;用于解决这些问题。本文将深入讨论volatile关键字和原子操作的用法&#xff0c;以及它们在多线程编程中的重要性和注意事项。 volatile关键字…

vue项目升级webpack

vue项目升级webpack 目录 1. vue项目中影响webpack版本的是什么 2.理解package.json中库前缀^和~区别 3.升级webpack4到5操作 1. vue项目中影响webpack版本的是什么 答案是&#xff1a;vue/cli-service版本 2.理解package.json中库前缀^和~区别 x.y.z x代表大版本&#xf…

ES修改字段的数据类型

-- mysql修改字段数据类型语句 ALTER TABLE 表名 MODIFY COLUMN 列名 修改的字段类型;-- hive 修改字段数据类型语句 ALTER TABLE 表名 CHANGE COLUMN 列名 修改的字段类型;--es修改字段数据类型语句无法通过一个语句进行修改。思路&#xff1a; 1、对修改字段重新建修改类型的…

Baichuan2大模型本地部署

作为今年九月份开源的一个中午大语言模型&#xff0c;Baichuan2已经在各个维度上取得了亮眼的结果&#xff0c;效果已经超过了当前火热的ChatGLM2-6B&#xff0c;可以通过自然语言交互的方式为你提供以下服务&#xff1a; 提供知识&#xff1a;我可以回答各领域的问题&#xf…

2023年科技核心目录已更新,24年选择刊物别选错!这些医药类期刊建议收藏!

2023年科技核心目录已更新&#xff0c;医药类期刊有这些&#xff08;部分&#xff09;&#xff0c;编码和期刊名称都给大家整理出来了。点常笑医学网查看全部科技核心期刊目录。 G218 ACTA PHARMACEUTICA SINICA B G001 ACTA PHARMACOLOGICA SINICA G780 CANCER BIOLOGY &am…

交叉编译错误:小心符号链接

交叉编译在进行到链接环节时出现找不到库文件的错误&#xff0c;如下&#xff1a; 一般来说&#xff0c;链接时出现库查找不到则需要将库路径添加到link_directories或者target_link_directories, 这里说查找不到libblas.so.3和liblapack.so.3&#xff0c;那么查找这两个库的路…

9.2 【MySQL】独立表空间结构

9.2.1 区&#xff08;extent&#xff09;的概念 对于16KB的页来说&#xff0c;连续的64个页就是一个 区 &#xff0c;也就是说一个区默认占用1MB空间大小。不论是系统表空间还是独立表空间&#xff0c;都可以看成是由若干个区组成的&#xff0c;每256个区被划分成一组。画个图…

视频文本检索(ICCV 23):Unified Coarse-to-Fine Alignment for Video-Text Retrieval

论文作者&#xff1a;Ziyang Wang,Yi-Lin Sung,Feng Cheng,Gedas Bertasius,Mohit Bansal 作者单位&#xff1a;UNC Chapel Hill 论文链接&#xff1a;http://arxiv.org/abs/2309.10091v1 项目链接&#xff1a;https://github.com/Ziyang412/UCoFiA 内容简介&#xff1a; …

怎么在OPPO手机桌面上添加文字?便签桌面插件添加教程

很多年轻女性在选择手机时&#xff0c;都比较青睐于设计时尚靓丽、轻薄且续航好、系统流畅、拍照清晰的OPPO手机&#xff0c;并且OPPO为不同的用户提供了高中低不同价格档位的手机型号&#xff0c;能够满足绝大多数女性消费者的使用需求。 不过有不少OPPO手机用户表示&#xf…

Linux 打包压缩命令

目前 linux 中打包和压缩的命令很多&#xff0c;最常用的方法有 zip、gzip、bzip2、xz、tar 1.zip 压缩包 //制作 //-r 递归 表示将指定的目录下的所有子目录以及文件一起处理 zip -r public.zip public//解压 unzip public.zip unzip public.zip -d dir//查看 unzip -l publi…

ubuntu 18.04 搭建isaacgym学习环境,并运行legged_gym

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、安装anaconda二、使用conda创建python版本为3.8的虚拟环境三、安装pytorch四、isaac-gym下载安装五、安装legged_gym总结 前言 系统&#xff1a;ubuntu18.…

WebGL HUD(平视显示器)

目录 HUD&#xff08;平视显示器&#xff09; 如何实现HUD 示例程序&#xff08;HUD.html&#xff09; 示例程序&#xff08;HUD.js&#xff09; 代码详解 在网页文字上方显示三维物体 代码详解 HUD&#xff08;平视显示器&#xff09; 平视显示器&#xff08;head…

第3章 MongoDB数据库操作<练习>

1. 创建数据库&#xff0c;名为zhangsan &#xff08;zhangsan修改为自己的姓名全 拼&#xff09; use wuweixian db.createCollection("wwx") 2. 批量插入多条文章评论用于测试 db.wwx.insertMany([ {"_id":"1","articleid":"…

沉降安全监测之静力水准仪安装与精度分析

静力水准仪的安装使用步骤如下&#xff1a; 1、选择合适的安装位置&#xff1a;静力水准仪应该安装在平稳且不易受到外力影响的地面上&#xff0c;以确保测量结果的准确性。同时&#xff0c;应避免安装在有风的地方&#xff0c;因为风会影响水准仪的读数。 2、安装支架&#…

基于矩阵分解算法的智能Steam游戏AI推荐系统——深度学习算法应用(含python、ipynb工程源码)+数据集(四)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 模型构建1&#xff09;定义模型结构2&#xff09;优化损失函数 3. 模型训练及保存1&#xff09;模型训练2&#xff09;模型保存 4. 模型应用1&#xff09;制作页面2&#xff09;模型导入及调用3&am…

MongoDB(一) windows 和 linux 之 Ubuntu 安装

数据库分类 一、关系型数据库&#xff08;RDBMS&#xff09; mysql 、Oracle、DB2、SQL Server 关系数据库中全都是表 二、非关系型数据库&#xff08;NO SQL&#xff09; MongoDB、Redis 键值对数据库 文档数据库MongoDB 下载 mongoDB https://www.mongodb.com/try/downloa…

DA1--用pandas查看网站用户数据

目录 1.题目描述 2.输入描述 3.输出描述 4.题目分析 5.通过代码 1.题目描述 现有一个Nowcoder.csv文件&#xff0c;它记录了牛客网的部分用户数据&#xff0c;包含如下字段&#xff08;字段与字段之间以逗号间隔&#xff09;&#xff1a; Nowcoder_ID&#xff1a;用户ID …