【C++】C/C++内存管理(new和delete详解)

2023-11-16

目录

1. C/C++内存分布

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

3. C++内存管理方式

3.1 new/delete操作内置类型

3.2 new/delete操作自定义类型

4. operator new与operator delete函数

4.1 operator new与operator delete函数(重点)

4.2 重载operator new和operator delete(了解)

5. new和delete的实现原理

5.1 内置类型

5.2 自定义类型

6. 定位new表达式(placement-new)(了解)

7. 常见面试题

7.1 malloc/free和new/delete的区别

7.2 内存泄漏

7.2.1 什么是内存泄漏,内存泄漏的危害

7.2.2 内存泄漏分类(了解)

7.2.3 如何检测内存泄漏(了解)

7.2.4 如何避免内存泄漏


1. C/C++内存分布

下面先看一段代码,通过这段代码简单分析C/C+的内存分布。

int globalVar = 3;
static int staticGlobalVar = 3;

void Test()
{
	static int staticVar = 7;

	int localVar = 7;
	int num1[10] = { 1, 2, 3, 4, 5 };

	const 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. 又叫做堆栈 -- 存储非静态局部变量/函数参数/返回值等,栈是向下增长的
  2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库,用户可使用系统接口创建共享内存,叫做进程间通信(这部分在Linux中会讲的比较详细,现在了解一下即可)
  3. 用于程序运行时动态内存分配,堆是可以向上增长的
  4. 数据段 -- 存储全局数据和静态数据
  5. 代码段  -- 存储可执行的代码/只读常量

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

这里稍微复习一下C语言中的动态内存管理方式,主要是通过malloc/calloc/realloc/free这几个函数去实现,他们的具体用法如下:

  1. malloc
    void* malloc(size_t _Size)

    形参_Size为要申请空间的大小(字节数),若函数执行成功,则返回获得的内存空间的首地址,若函数执行失败,返回NULL需注意malloc函数分配得到的空间是未初始化的,所以在malloc得到堆内存后一般可配合memset函数来初始化

  2. calloc

    void* calloc(size_t _Count, size_t _Size);

    形参_Count为申请类型的个数,_Size为单个类型的大小,返回值和malloc一样。与malloc的一个显著区别的calloc函数获得的空间是经过初始化的,且初始化为0

  3. realloc

    void* realloc(void* _Block, size_t _Size);

    形参_Block为堆上已经存在的空间的首地址,_Size为新空间的大小(字节数)。realloc函数的功能比malloc函数和calloc函数更为丰富,可以实现新内存分配和旧内存释放的功能。其功能为将_Block指向的堆内存块的大小改变为_Size字节,若_Size小于_Block之前指向的空间大小,则原地缩容;若_Size大于_Block之前指向的空间大小,且后面的空间足够时,原地扩容,反之,若后面的空间不够,则异地扩容,重新找一块大小为_Size的空间,将原来的数据拷贝到新空间后,_Block指向该新空间,并释放旧空间。另外,realloc函数分配的空间也是未初始化的

  4. free

    void free(void* _Block);

    形参_Block是通过上面三个函数获得的堆空间地址,free函数常和上面三个函数配合使用,主要功能就是将_Block指向的堆空间释放

面试题:malloc/calloc/realloc的区别是?

  • 相同点
    1. 都是从堆上申请空间
    2. 都需要对返回值判空(NULL)
    3. 都需要用户自己调用free释放
    4. 返回类型相同(void*)
    5. 都需要类型转换(对返回值强制转换)
    6. 底层实现上是一样的,除了要申请的空间外,都需要开辟多余的空间,用来维护申请的空间(以防越界)
  • 不同点
    1. 函数名/参数列表不同
    2. calloc会对申请的空间初始化为0,另外两个不会
    3. malloc申请的空间常常使用memset初始化
    4. realloc是对已存在的空间进行调整,当第一个参数传入NULL时,函数功能和malloc一样

3. C++内存管理方式

因为C++兼容C,所以C语言内存管理方式在C++仍可以继续使用,但有些地方却也是无能为力,而且比较麻烦

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

【C++】C/C++内存管理(new和delete详解) 的相关文章

  • C++ 维护子类对象的混合集合

    如果我在这里错过了一个相当基本的概念 我很抱歉 但我正在尝试弄清楚如何维护多个类类型的集合 所有类类型都派生自同一个父类 并且在检索它们时仍然可以访问它们的特定于子类的方法从集合中 作为上下文 我有一个基类 BaseClass 和许多类 例
  • 当我在组合框中选择一个项目时,如何防止 TextChanged 事件?

    我有一个TextChanged http msdn microsoft com en us library system windows forms control textchanged aspx我的事件ComboBox http msd
  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个

随机推荐

  • mysql--窗口函数

    一 前言 由力扣题引发的一次窗口函数的学习 mysql从8 0开始支持窗口函数 使用窗口函数 会令我们的分组查询变得便捷 二 概念 一 定义 窗口函数 对一个查询SQL 将其结果集按指定的规则进行分区 每个分区可以看作是一个窗口 分区内的每
  • 安卓Kotlin 使用ViewPager2实现简易左右滑动翻页效果

    布局很简单 R layout onepage仅有一个占满全屏幕的ImageView名为onei R layout activity view仅有一个占满全屏幕的ViewPager2名为vp 以下为Activity的全部代码 class Vi
  • 读完 DALL-E 论文,我们发现大型数据集也有平替版

    内容提要 OpenAI 团队的新模型 DALL E 刷屏 这一新型神经网络 使用 120 亿参数 经过 特训 任意描述性文字输入后 都可以生成相应图像 如今 团队将这一项目的论文和部分模块代码开源 让我们得以了解这一神器背后的原理 原创 H
  • 做BI领域的ChatGPT,思迈特升级一站式ABI平台

    8月8日 以 指标驱动 智能决策 为主题 2023 Smartbi V11系列新品发布会在广州丽思卡尔顿酒店开幕 后疫情时代 BI发展趋势的观察与应对 在发布会上 思迈特CEO吴华夫在开场致辞中表示 当前大环境背景下 数字化转型是企业高质量
  • 网站服务器记录攻击日志ctf,通过网站日志分析sql注入攻击的痕迹

    一次偶然的机会 我的朋友给我发了一个日志文件 让我看一下服务器access log文件 说是CTF的题目 给了它这样一个access文件 随后要了flag 因为我是专业划水的 CTF基本上不碰它 我也不知道怎么做 所以我试着分析了一下下 打
  • 用c++制作c++

    用c 制作c 我想了半年了 终于成功了 那么接下来我给大家分享一下我用c 制作c 的代码吧 include
  • 免费获取知网文献----浙江图书馆+支付宝

    使用支付宝办理浙江图书馆读者证 在支付宝搜索 浙江图书馆 并进入其生活号 开通借阅服务 办理读者证 使用读者证号登录浙江图书馆官网 通过以上步骤成功办理读者证后 会获取一个读者证号 在支付宝 浙江图书馆 生活号的首页或个人中心可以看到 使用
  • matlab 日期加小时数_matlab建立连续时间的时间函数

    满意答案 dashengjia 推荐于 2016 05 22 采纳率 55 等级 12 已帮助 7603人 这个是内建函数 源码不公开 CUMSUM Cumulative sum of elements For vectors CUMSUM
  • JSON 数据类型转换工具

    简介 本文介绍一款数据类型转换工具 可以将JSON格式数据转换成YAML MYSQL XML TOML JavaScript等数据类型 背景 在日常的开发工程中 我们经常使用JSON表达数据 但有些时候我们需要使用YAML JavaScri
  • Cannot make a static reference to the non-static method getLocalActivityManager()

    Cannot make a static reference to the non static method getLocalActivityManager from the type ActivityGroup 想调用getLocalA
  • Python 异常捕获与处理

    文章目录 一 基础知识 1 1 什么是异常 1 2 异常分类 1 3 异常的结构 二 异常类型 三 异常处理语法结构 3 1 语法结构 3 2 万能异常 3 3 try语法结构结合else和finally 四 异常处理补充 4 1 断言 4
  • Java swing + socket 写的一个五子棋网络对战游戏

    自从开始接触Swing以来 就喜欢写写各种管理系统 写多了就萌生了一种类似于实时在线对战的游戏 经过一番构思后就开始着手设计这个网络对战版本的五子棋了 游戏代码包含两部分 常规的C S模式 C代表客户端 S代表服务端 下载代码后先启动服务器
  • css3颜色渐变:css3如何实现背景颜色渐变?

    为了开发网页的美观 css3背景颜色渐变是经常会用到的 那么 css3背景颜色渐变如何设置呢 本篇文章我们就来介绍关于css颜色渐变背景的设置方法 我们要知道的是css3渐变有两种类型 css3线性渐变和css3径向渐变 下面我们就来看一下
  • C语言基础知识梳理<1>

    1 前言 各位小伙伴现在还在为学习C语言而苦恼吗 接下来我将更新一系列与C语言相关的文章与干货 希望各位小伙伴可以留下自己宝贵的 并持续关注我 真诚点赞 手留余香 2 网站推荐 软件推荐 用gitee 码云 保存自己的代码 自己写完的代码总
  • Visual Studio 2005 安装经验谈

    看到这题目 我都有点不自信 你用了Visual Studio 2005才几天啊 的确 关于编程我还是新手 不过这几天重复进行的Visual Studio 2005安装 到安装失败 再到解决问题 再安装 往返3次 下载Visual Studi
  • JDK 21探秘:引领Java开发新潮流的强大功能

    JDK 21是Java开发工具包的最新版本 它引入了许多令人振奋的新特性 旨在提高开发人员的生产力和代码质量 在本文中 我们将介绍一些JDK 21的新特性 并提供使用示例 以帮助您更好地理解和应用这些功能 一 字符串模板 String Te
  • 当SSC遇见RPA:最大化发挥共享服务模式效用

    作为一种创新的管理模式或战略 共享服务中心 SSC 如今正越来越受到企业的青睐 很多中大型集团 跨国公司都有某种类型的SSC存在 SSC可为企业带来哪些好处 RPA在这其中又是如何发挥作用 共享服务中心 Shared Service Cen
  • MAC版本Mysql数据库忘记密码解决教程

    MAC初始化安装获取密码 删除Data文件夹内容 并重新生成 rm rf usr local mysql data 初始化再次生成Data文件夹中的内容 初始化完成之后再代码最后生成随机密码需要保存 mysqld initialize us
  • 解决win 10操作系统中图片查看方式没有window7中的照片查看器问题

    1 在桌面新建一个记事本文件 保存为 reg 不能保存为 reg 代表任意 如下图 为我自建的 1 reg 2 保存后 双击打开该文件 并将如下代码拷入 并保存 如下图 2 1 右键该文件用记事本或者notepad 打开 我这里是用note
  • 【C++】C/C++内存管理(new和delete详解)

    目录 1 C C 内存分布 2 C语言中动态内存管理方式 3 C 内存管理方式 3 1 new delete操作内置类型 3 2 new delete操作自定义类型 4 operator new与operator delete函数 4 1