侯捷 C++ 课程学习笔记:内存管理的每一层面

news/2025/2/25 2:51:44

目录

一、C++ 应用程序的内存管理架构

二、C++ 内存原语

三、内存管理的实际应用

四、学习心得


一、C++ 应用程序的内存管理架构

C++ 应用程序的内存管理架构可以分为多个层次,从应用程序到操作系统 API,每一层都提供了不同的内存管理功能。

架构图:

C++ Applications
  ↓
C++ Library (std::allocator)
  ↓
C++ primitives (new, new[], ::operator new(), ...)
  ↓
CRT (malloc / free)
  ↓
O.S. API (such as HeapAlloc, VirtualAlloc, ...)
  1. C++ 应用程序(C++ Applications)

    • C++ 应用程序是内存管理的最上层,使用 C++ 提供的各种内存管理工具和库来分配和释放内存。

  2. C++ 标准库(C++ Library)

    • C++ 标准库提供了 std::allocator 等内存分配器,用于管理内存的分配和释放。std::allocator 是一个通用的内存分配器,可以与标准容器(如 vectorlist 等)配合使用。

  3. C++ 原语(C++ primitives)

    • C++ 提供了多种内存分配和释放的原语,包括 newnew[]::operator new()::operator delete() 等。这些原语可以直接用于分配和释放内存。

  4. C 运行时库(CRT, C Runtime Library)

    • CRT 提供了 mallocfree 等函数,用于分配和释放内存。这些函数是 C 语言标准库的一部分,也可以在 C++ 中使用。

  5. 操作系统 API(O.S. API)

    • 操作系统提供了底层的内存管理 API,如 HeapAllocVirtualAlloc 等,用于直接与操作系统交互,进行内存的分配和管理。

二、C++ 内存原语

C++ 提供了多种内存分配和释放的原语,这些原语在不同的场景下使用,具有不同的特点和用途。

内存原语表格:

分配函数释放函数类属可否重载
malloc()free()C 函数不可
newdeleteC++ 表达式 (expressions)不可
::operator new()::operator delete()C++ 函数
allocator<T>::allocate()allocator<T>::deallocate()C++ 标准库可自由设计并搭配任何容器
  1. malloc()free()

    • 类属:C 函数。

    • 特点malloc() 用于分配内存,free() 用于释放内存。这些函数是 C 语言标准库的一部分,可以在 C++ 中使用。

    • 限制:不可重载。

  2. newdelete

    • 类属:C++ 表达式。

    • 特点new 用于分配内存并调用构造函数,delete 用于释放内存并调用析构函数。这些表达式是 C++ 的核心内存管理工具。

    • 限制:不可重载。

  3. ::operator new()::operator delete()

    • 类属:C++ 函数。

    • 特点::operator new() 用于分配内存,::operator delete() 用于释放内存。这些函数可以被重载,以实现自定义的内存分配和释放逻辑。

    • 限制:可重载。

  4. allocator<T>::allocate()allocator<T>::deallocate()

    • 类属:C++ 标准库。

    • 特点allocator<T> 是 C++ 标准库中的内存分配器,allocate() 用于分配内存,deallocate() 用于释放内存。这些函数可以自由设计并搭配任何容器使用。

    • 限制:可自由设计并搭配任何容器。

三、内存管理的实际应用

在实际应用中,合理选择和使用内存管理工具可以显著提高程序的性能和可维护性。

以下是一些具体的使用场景和示例代码:

  1. 使用 newdelete

    int* ptr = new int(10);  // 分配内存并初始化
    std::cout << *ptr << std::endl;  // 输出 10
    delete ptr;  // 释放内存
  2. 使用 mallocfree

    int* ptr = (int*)malloc(sizeof(int));  // 分配内存
    *ptr = 10;  // 初始化
    std::cout << *ptr << std::endl;  // 输出 10
    free(ptr);  // 释放内存
  3. 使用 allocator

    std::allocator<int> alloc;  // 创建分配器
    int* ptr = alloc.allocate(1);  // 分配内存
    alloc.construct(ptr, 10);  // 初始化
    std::cout << *ptr << std::endl;  // 输出 10
    alloc.destroy(ptr);  // 销毁对象
    alloc.deallocate(ptr, 1);  // 释放内存
四、学习心得

课程内容从基础到高级,逐步引导学员掌握 C++ 的内存管理工具和方法。特别是对 newdeletemallocfree 以及 allocator 的使用,为后续的面向对象编程和高级开发打下了坚实的基础。

在实际编程中,合理使用这些内存管理工具可以显著提高代码的可读性和可维护性。


http://www.niftyadmin.cn/n/5864938.html

相关文章

网络运维学习笔记 018 HCIA-Datacom综合实验02

文章目录 综合实验2sw3&#xff1a;sw4&#xff1a;gw&#xff1a;core1&#xff08;sw1&#xff09;&#xff1a;core2&#xff08;sw2&#xff09;&#xff1a;ISP 综合实验2 sw3&#xff1a; vlan 2 stp mode stp int e0/0/1 port link-type trunk port trunk allow-pass v…

C#中级教程(2)——走进 C# 面向对象编程:从基础到进阶的深度探索

一、为什么选择面向对象编程 在软件开发的演进过程中&#xff0c;随着程序规模和复杂度的不断增加&#xff0c;传统的编程方式逐渐暴露出局限性。面向对象编程应运而生&#xff0c;它就像是一位智慧的组织者&#xff0c;将程序中的功能进行模块化划分。每个模块各司其职&#x…

深度学习每周学习总结Y1(Yolov5 调用官方权重进行检测 )

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客Y1中的内容 &#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 ** 注意该训练营出现故意不退押金&#xff0c;恶意揣测偷懒用假的结果冒充真实打卡记录&#xff0c;在提出能够拿到视频录像…

《Kali Linux从安装到武器化配置:打造你的数字军火库》

0x00 颠覆式安装&#xff1a;不止于虚拟机 方案一&#xff1a;物理机裸装&#xff08;性能全开模式&#xff09; 关键步骤&#xff1a; # 禁用安全启动&#xff08;UEFI设置&#xff09; # 使用dd命令制作启动盘&#xff08;注意数据销毁警告&#xff09; sudo dd ifkal…

基于大语言模型的推荐系统(1)

推荐系统&#xff08;recommendation system&#xff09;非常重要。事实上&#xff0c;搜索引擎&#xff0c;电子商务&#xff0c;视频&#xff0c;音乐平台&#xff0c;社交网络等等&#xff0c;几乎所有互联网应用的核心就是向用户推荐内容&#xff0c;商品&#xff0c;电影&…

达梦DTS数据迁移工具生产篇(MySQL->DM8)

本文章使用的DTS工具为 2024年9月18日的版本&#xff0c;使用的目的端DM8数据库版本为2023年12月的版本&#xff0c;注意数据库版本和DTS版本之间跨度不要太大&#xff0c;以免出现各种兼容性的报错。若发现版本差距过大时&#xff0c;请联系达梦技术服务工程师处理。 1. 迁移…

Pytorch使用手册-音频 I/O(专题十八)

音频输入/输出 本教程展示了如何使用TorchAudio的基本输入/输出(I/O)API来检查音频数据,将其加载到PyTorch张量中,并保存PyTorch张量。 警告 在最近的版本中,音频输入/输出进行了多个计划或已实施的更改。有关这些更改的详细信息,请参考“Dispatcher 介绍”。 import to…

01 冲突域和广播域的划分

目录 1、冲突域和广播域的划分 1.1、冲突域 1.2、广播域 1.3、对比总结 1.4、冲突域与广播域个数计算例题 2、交换机和路由器的结构 2.1、交换机的结构 2.2、路由器的结构 1、冲突域和广播域的划分 1.1、冲突域 冲突域是指网络中可能发生数据帧冲突的物理范围。当多…