【从零开始学c++】——C++动态内存管理

2023-10-29

在这里插入图片描述

1.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";
 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在哪里?____

答案:
在这里插入图片描述
解析:因为globalVar是全局变量,staticGlobalVar和staticVar是静态变量,所以它们存储在数据段中,localVar是main函数中的局部变量,num1 是数组名,表示的是数组首元素的地址,为指针变量,也为局部变量,所以它们存储在栈中,
char char2[] = "abcd"表示的意思是将字符串“abcd”拷贝一份存储在char2[]的数组中,所以char2和*char2都表示的是局部变量,都存储在栈中,

在这里插入图片描述

char* pChar3 = "abcd"表示的是将“abcd”的地址储存在pChar3中,所以pChar3是局部变量,而*pChar3是常量字符串,储存在代码段,

在这里插入图片描述
int* ptr1 = (int*)malloc(sizeof (int)*4);表示的是动态开辟一块空间,然后将这块空间的地址存储在ptr1,所以ptr1为局部变量,*ptr1指向动态内存。

2.c++中的动态内存管理

与之前学过的c语言知道,要想申请一块动态内存,我们要使用malloc去向系统申请一块空间,系统就会将这块空间的使用权给你当这块空间不用时,我们在把这块间free掉,也就是这块空间的使用权还给系统。

问题:malloc/calloc/realloc的区别?
malloc会在堆上申请一块动态空间,但这块空间没有初始化,而calloc也会去堆上申请一块空间,但会把这块空间初始化为0,realloc则针对已有的空间进行扩容(有原地扩容和异地扩容)

在这里插入图片描述
而c++中则一般会用new/delete去申请动态空间。

int main()
{
	//申请10个int类型的空间
	int* p1 = (int*)malloc(sizeof(int) * 10);
	int* p2 = new int[10];

	free(p1);
	delete[]p2;

	//申请一个int类型的空间
	int* p3 = (int*)malloc(sizeof(int));
	int* p4 = new int;

	free(p3);
	delete p4;

	return 0;
}

注意:new/delete new[]/delete[]一定要匹配,否则可能会出错。

我们可以看到new类型比malloc操作起来更方便一些,看起来清楚明了,但是难道仅仅只有这些吗,答案是否定的。
在这里插入图片描述
由上图可以见,用new去申请自定义类型的空间,它会去自动调用构造函数初始化,用delete去释放空间,则会去调用析构函数
在这里插入图片描述
如果申请3个ListNode的空间,则会调用3次的构造函数,delete时也会去调用3次析构函数。

3.operator new和operator delete

首先我们得知道new的执行过程它会去调用operator new去申请空间和调用构造函数初始化,delete的执行过程会去调用operator delete去释放空间和析构函数完成对象的资源清理工作
而operator new的底层相当于malloc开空间和抛异常,operator delete的底层相当于free释放空间和抛异常。
什么是抛异常?
抛异常的方法来实现当次执行的程序中断,而不是整个程序全部终止,而断言则会使整个程序终止。

4.什么是内存泄露

申请的空间使用完后没有及时释放,而是指向的那块空间的指针给先销毁掉,导致这块空间没有还给系统,这块空间我们却找不到它,系统不能去重新分配这块空间,但是那块依然存在那里,最终造成内存的浪费。
在这里插入图片描述
内存泄露的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。所以要特别注意及时释放内存。

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

malloc/free,new/delete的共同点都是在堆上申请空间,需要自己释放。
而它们的不同的有:
1.new/delete定义自定义类型会自动调用构造函数和析构函数,而malloc/free不会。
2.new申请空间失败直接抛异常,malloc/f出错返回空指针。
3.new/delete是操作符,malloc/free是函数。
4.malloc申请空间时需要计算空间大小,new只需要在加上空间的类型即可。
5.malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【从零开始学c++】——C++动态内存管理 的相关文章

  • 双缓冲列表框

    我有一个 CheckedListBox WinForms 控件 它继承自 ListBox 谷歌搜索显示问题出在 ListBox 该控件锚定到其窗体的所有四个边 当调整表单大小时 列表框会出现难看的闪烁 我尝试继承 CheckedListBo
  • 以编程方式在网格视图列上显示数据

    我有一个产品数量列表和一个网格视图 网格视图已经绑定到一些数据 但我想在网格视图的第三列显示产品数量列表 以下是如何将数据绑定到网格视图的代码 gvProduct DataSource distSPUItem gvProduct DataB
  • 强制 const 存储返回的值 value

    这就是我想要实现的目标 struct test const test returnconst return test test returnnonconst return test int main test t1 returnnoncon
  • 类变量在其定义范围内?

    这可能是一个愚蠢的问题 我正在尝试制作文本泥 我需要每个 Room 类包含其他 Room 类 以便在尝试移动到它们或从它们获取信息时可以引用 但是 我不能这样做 因为我显然无法在其定义中声明一个类 那么 我该怎么做呢 当我说我做不到时 我的
  • 如何在运行 ASP.NET 页面时以编程方式设置表格背景?

    我有一个 aspx 页面 其默认背景颜色是一种 当选择单选按钮的某个选项时 我需要能够以编程方式更改它 我尝试设置表的 ID 字段 但似乎无法在 C 代码隐藏文件中访问它 我原来的表是 table style width 100 backg
  • NHibernate手动控制抓取

    我正在使用 NHibernate 我想控制手动获取相关实体 这是我的示例实体 public class Post public virtual long Id get set public virtual string Title get
  • 任务计划程序控制台输出在哪里? (C# 控制台应用程序)

    我正在运行 C Windows 控制台应用程序 并通过任务计划程序传递几个参数 它全天运行 将其他应用程序创建的平面文件数据加载到 SQL Server 中 该程序间歇性失败 并且我有 Try Catch 逻辑 该逻辑使用 Console
  • 如何在 C++ 中的嵌套词法作用域可访问的作用域中声明静态信息?

    我想声明范围的标识符 该标识符将用于自动填充最内部范围内任何日志记录语句的字段 它们通常会 但并非总是如此 例如 lambda 使用 引入的块 匹配封闭块的 名称 用法看起来像这样 namespace app LOG CONTEXT app
  • 在 IEnumerable 中查找相同的集合

    有一项任务要弄清楚如何更新表 DataTable 连接到一个database没有UPDATE陈述 我想出的例子是从邮箱中读取警报 该表将写入 Alerts 如果邮件正文包含单词 SUCCESS gt Alert 变为绿色 如果 FAIL g
  • C# 从整数反序列化枚举

    是否可以从 C 中的 int 反序列化枚举 例如如果我有以下课程 class Employee public string Name get set public int EmployeeTypeID get set 我可以轻松地从 XML
  • 带有 Prism 区域适配器的 AvalonDock

    我看到了一些关于 SO 的问题 但似乎没有一个适合我 我希望能够使用伟大的使用 Prism 4 但是 所有示例区域适配器均适用于 Avalondock 1 x 系列 我无法使其工作 有人有关于如何为 AvalonDock 的 LayoutD
  • flowlayoutpanel和水平滚动条问题

    我正在使用一个 flowlayoutpanel 它有很多逻辑上的按钮 我遇到的问题是 当我调整窗口大小时 当窗口变小时 我无法看到所有水平排列的按钮 相反 当窗口变小时 按钮会下降到下一行 谁能帮我解决这个问题 我只是希望按钮水平排列 当窗
  • 在 C++ 中从另一个数组初始化结构内的数组[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions struc
  • 将控制台输入和输出重定向到文本框

    您好 提前致谢 我正在尝试 非常努力 将控制台输入和输出重定向到文本框 到目前为止 输出工作正常 但问题在于输入 例如 我无法执行一个简单的程序来执行以下操作 Console WriteLine 请输入您的姓名 字符串名称 Console
  • Parallel ForEach 的本地初始化如何工作?

    我不确定 Parallel ForEach 中本地 init 函数的使用 如 msdn 文章中所述 http msdn microsoft com en us library dd997393 aspx http msdn microsof
  • ASP.NET Core中间件如何进行DI?

    我正在尝试将依赖项注入到我的中间件构造函数中 如下所示 public class CreateCompanyMiddleware private readonly RequestDelegate next private readonly
  • BlueZ D-Bus C,应用 BLE

    我正在尝试编写一个应用程序来搜索附近的蓝牙设备并与它们通信 我的应用程序将用 C 语言编写 并打算在 Linux 下工作 是否有通过 C 中的 D Bus 使用 BlueZ 的教程或示例 此应用程序的目的是从 BLE 中的文件发送数据 你能
  • Xamarin Forms:System.Reflection.TargetInitationException:调用目标已引发异常

    我正在为这个问题苦苦挣扎 我只是创建了一个简单的跨平台页面 这里是 XAML 代码
  • wpf中的图像问题(图像不显示)

    我不明白为什么我无法在 WPF 中显示图像 也许我不小心修改了我的资源文件夹 这就是我没有显示的原因 所以我创建了一个新的 wpf 应用程序 我有这个 当我运行该程序时 我的图片显示为 为什么当我尝试在程序中执行相同的操作时 图像没有显示
  • 文件按文件名模式存在

    我在用 File Exists filepath 我想做的是将其替换为模式 因为文件名的第一部分发生了变化 例如 该文件可以是 01 peach xml 02 peach xml 03 peach xml 如何根据某种搜索模式检查文件是否存

随机推荐

  • 继电器控制电路

    继电器控制电路 原理 控制方式 继电器种类 案例 原理 使用控制电器的触点 按钮 开关或继电器触点 控制用电器工作 控制方式 手动控制 触点通 断用人工控制 比如按钮 手动开关 自动控制 触点通断可以自动实现 如行程开关 继电器 继电器种类
  • UE4之HTTP请求

    UE4中的HTTP模块封装了libcurl的HTTP功能 很容易实现HTTP下载和上传功能 代码如下 class FHttpRequestTest void Download const FString URL TSharedRef Htt
  • JS /JQ文件、图片上传+图片预览(二进制、base64)

    一 base64
  • unity刘海屏适配

    public class SafeArea MonoBehaviour private Rect safeArea public Action
  • 安装chromadb遇到的问题与python3升级

    环境 python 3 10 centos 7 x 使用 pip3 install chromadb 时 遇到以下问题 问题1 gcc note This error originates from a subprocess and is
  • 系统建模与仿真项目驱动设计报告-基于MATLAB的GUI界面设计

    摘 要 MATLAB语言是一种十分有效得工具 能够容易解决在系统仿真以及控制系统计算机辅助设计领域的解决问题 在本次的系统建模与仿真设计中 需要使用人机交互界面 MATLAB GUI功能设计一个系统仿真GUI界面 由于GUI本身提供了Win
  • 伽罗华域(Galois Field)理解、基于伽罗华域的四则运算(附详细python代码)

    参考链接 https blog csdn net luotuo44 article details 41645597 参考链接 https blog csdn net shelldon article details 54729687 伽罗
  • 能在路由器里挂载阿里云盘的aliyundrive-webdav

    什么是 aliyundrive webdav aliyundrive webdav 是阿里云盘 WebDAV 服务 主要使用场景为配合支持 WebDAV 协议的客户端 App 如 Infuse nPlayer 等实现在电视上直接观看云盘视频
  • 6. 模块

    http www pythondoc com pythontutorial3 modules html 6 模块 如果你退出 Python 解释器并重新进入 你做的任何定义 变量和方法 都会丢失 因此 如果你想要编写一些更大的程序 为准备解
  • SpringBoot整合SpringSecurity遇到的SESSION验证问题

    前言 项目是之前的老项目springmvc jsp项目改的 因为需要对框架做改动 功能没有大改动 所以没有采用前后端分离的方式 后端采用springboot spring security前端还是jsp 所以还是session验证的方式登录
  • 删除打开eclipse时workspace列表中你不希望保存的workspace项

    删除打开eclipse时workspace列表中你不希望保存的workspace 正文 嗯 强迫症使世界更美好 正文 说自己用 idea 开发的请去旁边做一下 这我们先说eclipse的 有些时候 我们需要使用 Eclipse 来开发不同的
  • SpringBoot基本知识汇总

    xl echo编辑整理 交流学习请加1280023003 百战不败 依不自称常胜 百败不颓 依能奋力前行 这才是真正的堪称强大 为什么要用springboot 传统项目配置文件过于臃肿 传统项目依赖版本之间兼容问题 传统项目整合步骤相对繁琐
  • 安装python的ta-lib包遇到的问题及解决

    pip brew均不成功 可以试试下面的命令 conda install c conda forge ta lib
  • 网络传输知识:HTTP协议

    计算机网络体系结构的通信协议 1 物理层 以太网 调制调节器 电力线通信 SONET SDH 光导纤维 同轴电缆 双绞线等 2 数据链路层 Wi Fi IEEE 802 11 WiMAX IEEE 802 16 ATM 令牌环 PPP L2
  • zookeeper面试专题及答案

    1 ZooKeeper 是什么 ZooKeeper 是一个分布式的 开放源码的分布式应用程序协调服务 是 Google 的 Chubby 一个开源的实现 它是集群的管理者 监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作 最终
  • db2解除死锁实例

    背景 在团队协作的开发环境下 难免会遇到多个成员同时访问一张表的情况 在断点调试时 又非常容易加事务的长连接 引发死锁 下面实例讲解解锁过程 解锁过程 查找节点 解锁之前 需要知道数据库所在节点 db2 gt LIST NODE DIREC
  • Pyqt5实战修炼之label图像动态自适应窗口大小

    Pyqt5之动态label窗口大小 问题描述 当我们需要在界面上显示结果图片或者是可视化表达一些数据的时候 通常使用label控件 进行显示 但是因为不确定图片的大小导致显示不全或者当窗口大小变化的时候不能自适应调节label的大小 问题分
  • 农业数据爬虫:Python爬虫获取农产品价格和农业技术信息

    目录 第一部分 选择目标网站 第二部分 分析网站结构和查询参数
  • long包中的八大基本包装类

    一 long包 包装类 八大基本包装类 整数 包装类 byte Short Int Integer Long 除了那两个写出来的 其他的包装类都是把原始类中的首字母大写 小数 float double 字符 char Character 布
  • 【从零开始学c++】——C++动态内存管理

    C 动态内存管理 1 C C 内存分布 2 c 中的动态内存管理 3 operator new和operator delete 4 什么是内存泄露 5 malloc free和new delete的区别 1 C C 内存分布 接下来我们来看