lesson4-C++内存管理

news2024/12/23 17:56:33

个人主页:Lei宝啊 

愿所有美好如期而遇


目录

C/C++内存分布

C语言中动态内存管理方式

C++中动态内存管理

operator new与operator delete函数

new和delete的实现原理

定位new表达式(placement-new)

常见面试题


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

第一组问题:

选项 : A .   B .   C . 数据段 ( 静态区 )   D . 代码段 ( 常量区 )   
问题:以下变量存储在哪里?
  • globalVar
  • staticGlobalVar
  • staticVar
  • localVar
  • num1
第二段代码:
void Test()
{
	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);
}
第二组问题:
选项 : A .   B .   C . 数据段 ( 静态区 )   D . 代码段 ( 常量区 )   
问题:以下变量存储在哪里?
  •    char2      *char2
  • pChar3      *pChar
  •       ptr1      *ptr1
第三组问题:
  •    sizeof(num1)
  •    sizeof(char2)        strlen(char2
  • sizeof(pChar3)        strlen(pChar3)
  •       sizeof(ptr1)

C语言中动态内存管理方式

malloc/calloc/realloc/free

C++中动态内存管理

C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因 此C++又提出了自己的内存管理方式:通过newdelete操作符进行动态内存管理

new/delete操作内置类型

new delete 操作自定义类型

operator new与operator delete函数

首先我们要明白operator new和operator delete是函数,而new和delete是操作符,他们直接是有联系,但不是重载关系,只是祖师爷起名字这么起。

operator new函数里调用了malloc函数,也就是说其实可以将他看做是malloc函数的封装,但是不同的是,malloc函数申请空间失败后返回NULL,而operator new函数里实现了判断malloc申请空间失败就抛出异常。

operator delete函数里也就是调用了free函数,这个函数主要是为了和operator new函数对称匹配。

new和delete的实现原理

对内置类型来说

new操作符底层只调用operator new函数,因为内置类型不需要构造函数和析构函数,所以new也不会调用构造函数

delete操作符只调用operator delete函数,同理,他也不会调用析构函数。

对自定义类型来说

new操作符的底层原理是先调用operator new函数,然后调用构造函数

delete操作符底层原理是先调用析构函数,然后调用operator delete函数

class Stack
{
public:
	Stack(int capacity = 4)
		:_capacity(capacity)
		,_top(0)
	{
		_a = new int[capacity];
		_top++;

		cout << "构造" << endl;
	}

	~Stack()
	{
		delete[] _a;
		_a = nullptr;
		_top = _capacity = 0;

		cout << "析构" << endl;
	}

private:
	int* _a;
	int _top;
	int _capacity;

};

int main()
{

	Stack* st = new Stack;
    delete st;

	return 0;
}

我们可以查看一下汇编代码来理解。

int main()
{

	Stack* st2 = new Stack[3];
	delete[] st2;

	return 0;
}

实际上三个对象的空间是一次性全部申请好,然后每个对象都调用构造函数。

析构的时候我们明明没有给delete[]传大小,他是怎么知道要析构三次的呢?

我们调试看一下内存

operator new[]本质上还是调用operator new函数

operator delete[]里面调用的是operater delete 

定位new表达式(placement-new)

定位new是在已申请的原始内存空间中掉用一个构造函数初始化一个对象。

这个我们现阶段用不上,毕竟直接创建对象自动调用进行初始化多好,总不能malloc自定义类型的对象,然后使用定位new吧,就像这样:

哪个更好一目了然,我们的定位new真正用途是在内存池那里才会展现。

常见面试题

7.1 malloc/free和new/delete的区别
相同点:
都需要在堆上申请空间,并且都需要手动释放。
不同点:
  • malloc和free是函数,而new和delete是操作符
  • malloc开辟空间需要计算大小,而new只需要加上类型,如果需要开辟空间,只需要在[]里指定大小即可。
  • malloc返回值为void*类型,使用时需要强制转换,而new不需要。
  • malloc开辟内存空间失败返回NULL,而new则是抛出异常。
  • malloc开辟的内存空间是原始的,不会初始化,也不能初始化,而new开辟的内存空间可以手动初始化,如果是自定义类型,还会自动去调用他的构造函数;而delete在释放内存空间时会先去调用自定义类型对象的析构函数,free不会。
7.2 内存泄漏
内存泄漏就是因为疏忽或者其他原因未能释放已经不再使用的内存空间,失去了对该断内存的控制,最终导致内存出现浪费。
长期运行的程序出现内存泄漏危害很大,最终会导致响应越来越慢,最终卡死。

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

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

相关文章

【搭建IIS网站教程】

文章目录 一、搭建IIS网站二、http重定向三、虚拟目录四、用域名访问网站五、网站安全六、小知识总结 一、搭建IIS网站 1、Windows Server 2008中配置IIS 打开服务器管理器&#xff0c;角色&#xff0c;添加角色&#xff0c;然后点击下一步 选择安装web服务器iis 选择角色…

纯python代码快速实现简易带界面的数字华容道小游戏

数字华容道是一种经典的益智游戏&#xff0c;旨在通过移动数字方块的位置&#xff0c;将它们按照正确的顺序排列。游戏板由一个4x4的方格组成&#xff0c;其中包含了编号为1到15的数字方块&#xff0c;以及一个空白方块。 游戏开始时&#xff0c;数字方块被随机打乱并填充到方格…

Linux-用户与用户组,权限

1.用户组管理&#xff08;以下命令需root用户执行&#xff09; ①创建用户组 groupadd 用户组名 ②删除用户组 groupdel 用户组名 2.用户管理&#xff08;以下命令需root用户执行&#xff09; ①创建用户 useradd [-g -d] 用户名 >-g&#xff1a;指定用户的组&#xff0c;不…

香橙派5部署chatglm2-6b模型

香橙派5部署chatglm2-6b模型 环境信息&#xff1a; 部署服务器&#xff1a;orangepi 5 16G版本 系统版本&#xff1a;Ubuntu 22.04.3 LTS 参考文档&#xff1a; 利用GPU加速&#xff0c;在Orange Pi上跑LLMs &#xff1a; https://zhuanlan.zhihu.com/p/650110025 遥遥领…

Python语法基础(变量 注释 数据类型 输入与输出 运算符 缩进)

目录 变量变量命名规则变量的类型变量的创建变量的作用域 注释的方法数据类型对象和引用的概念Number(数字)数据转换 输入与输出输入函数输出函数输出函数的end参数输出格式多行语句 运算符算术运算符赋值运算符三目运算符运算符的优先级 缩进缩进格式注意事项层级嵌套 变量 标…

Web实验总

目录 网站需求&#xff1a; 思路&#xff1a; 实验步骤&#xff1a; 第一步&#xff1a;准备工作 第二步&#xff1a;新建一个存储网页的目录 第三步&#xff1a;修改本地hosts映射 第四步&#xff1a;修改配置文件&#xff0c;建立基于http服务的网站 1)创建用户song和…

计算机考研408到底有多难?25届开个好头很有必要

前言 大家好&#xff0c;我是陈橘又青&#xff0c;相信关注我的各位小伙伴们中&#xff0c;大多都是在计算机专业的大学生吧&#xff01; 每天都有许多人在后台私信我&#xff0c;问我要不要考研&#xff0c;我想说这个东西是因人而异的&#xff0c;像我本人就选择了就业&…

STL常用库函数复习

文章目录 pairvectorliststackqueuequeuepriority_queuequeue双端队列 set✨set集合✨multiset 多重集合了解&#xff1a;unordered_set 无序集合 map&#x1f31f;map几乎不用&#xff1a;multimap一般不用&#xff1a;undered_map pair utility示例 #include <iostream&…

使用Python自动检测SSL证书是否过期

目录 一、概述 二、SSL证书过期检测原理 三、Python实现SSL证书过期检测 四、注意事项 总结 一、概述 随着互联网的普及和安全意识的提高&#xff0c;SSL证书的使用变得越来越重要。SSL证书可以提供加密通信&#xff0c;保护用户的数据安全&#xff0c;防止中间人攻击等。…

切换闭锁元件 双位置继电器 TST-AB440GT DC24V 导轨安装

TST440AB-GT双位置继电器用于交直流操作的各种保护和自动控制的装置中&#xff0c;作为切换闭锁元件。 系列型号&#xff1a; DSP2-4A重动继电器&#xff1b;DSP2-2A2B重动继电器&#xff1b; DSP2-3A1B重动继电器&#xff1b;TST440GT双母线切换继电器&#xff1b; TST220GT双…

MIPSsim模拟器 使用说明

&#xff08;一&#xff09; 启动模拟器 双击MIPSsim.exe&#xff0c;即可启动该模拟器。模拟器启动时&#xff0c;自动将自己初始化为默认状态。所设置的默认值为&#xff1a; u所有通用寄存器和浮点寄存器为全0&#xff1b; u内存清零&#xff1b; u流水寄存器为全0&#xff…

Dapp开发流程以及应用

随着区块链技术的发展和普及&#xff0c;Dapp&#xff08;去中心化应用&#xff09;逐渐成为了区块链领域中备受关注的话题。Dapp是一种运行在区块链网络上的应用程序&#xff0c;具有去中心化、透明、安全、自治等特点&#xff0c;能够为人们提供更加便捷、高效、安全的应用体…

Essential Math for AI:高效的人工智能数学原理晋级读物

今天给大家介绍一本人工智能数学原理书籍&#xff1a;Essential Math for AI。作者是Hala Nelson&#xff0c;一位应用数学领域的美女博士&#xff0c;James Madison University (JMU) 大学的助理教授。 关注微信公众号&#xff1a;人工智能大讲堂&#xff0c;后台回复【ema】获…

使用反射调用私有内部类方法

使用反射调用私有内部类方法 通过反射机制调用私有内部类方法,反射机制允许在运行时检查和操作类和方法。可以使用反射机制创建内部类的实例,并调用其私有方法 🍓情况一: 注意这里的内部类是私有静态内部类 待测类如下: package jj;import java.lang.reflect.Constru…

MySQL时间类型注意事项

MySQL常见的时间类型有YEAR、DATE、TIME、DATETIME、TIMESTAMP&#xff0c;绝大多数业务都是精确到秒的&#xff0c;所以通常用后两种。并且MySQL5.6以后后两种支持精度到毫秒&#xff08;最多小数点后6位&#xff09; DATETIME占8字节&#xff0c;不论要不要毫秒 TIMESTAMP占4…

三大赛题指南发布!2023 冬季波卡黑客松本周末开启 Workshop

2023 年一众黑客松赛事中&#xff0c;为什么我们建议您选择波卡黑客松大赛&#xff1f;或许答案在于——作为开发者极度友好的技术生态&#xff0c;波卡能够从参赛者的立场出发&#xff0c;为大家提供从 0 到 1 实现项目孵化成长的机会。这里聚集了一线技术专家的资源力量&…

【Spring】Spring IOCDI详解

文章目录 1. Spring是什么&#xff1f;2. 认识IOC2.1 传统程序开发1. Main.java2. Car.java3. Framework.java4. Bottom.java5. Tire.java 2.2 分析传统开发2.3 IOC程序开发1. Main.java2. Car.java3. Framework.java4. Bottom.java5. Tire.java 2.4 分析IOC开发2.5 IOC容器优点…

剑指offer(C++)-JZ21:调整数组顺序使奇数位于偶数前面(一)(算法-其他)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 题目描述&#xff1a; 输入一个长度为 n 整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有的奇数…

外贸SEO外链类型有哪些?外链建设如何做?

外贸SEO外链资源怎么找&#xff1f;海洋建站SEO外链优化方法&#xff1f; 外贸SEO外链在提高网站排名、吸引流量、增加品牌曝光方面发挥着重要作用。海洋建站将探讨外贸SEO外链的不同类型&#xff0c;帮助外贸企业更好地理解如何优化他们的在线营销策略。 外贸SEO外链&#x…

【PostgreSql高阶语法 】1、CASE WHEN THEN END用法

目录 1. 基础描述2. 用法举例2.1 基础使用2.1.1 方式12.1.2 方式 2 2.2 进行分组2.3 分组练习举例 1. 基础描述 目的&#xff1a;在SQL语句中添加判断条件&#xff0c;就要用到CASE WHEN THEN END用法&#xff1a;类似于java里面的switch语句&#xff0c;一组CASE WHEN THEN E…