目录
一、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, ...)
-
C++ 应用程序(C++ Applications):
-
C++ 应用程序是内存管理的最上层,使用 C++ 提供的各种内存管理工具和库来分配和释放内存。
-
-
C++ 标准库(C++ Library):
-
C++ 标准库提供了
std::allocator
等内存分配器,用于管理内存的分配和释放。std::allocator
是一个通用的内存分配器,可以与标准容器(如vector
、list
等)配合使用。
-
-
C++ 原语(C++ primitives):
-
C++ 提供了多种内存分配和释放的原语,包括
new
、new[]
、::operator new()
、::operator delete()
等。这些原语可以直接用于分配和释放内存。
-
-
C 运行时库(CRT, C Runtime Library):
-
CRT 提供了
malloc
和free
等函数,用于分配和释放内存。这些函数是 C 语言标准库的一部分,也可以在 C++ 中使用。
-
-
操作系统 API(O.S. API):
-
操作系统提供了底层的内存管理 API,如
HeapAlloc
、VirtualAlloc
等,用于直接与操作系统交互,进行内存的分配和管理。
-
二、C++ 内存原语
C++ 提供了多种内存分配和释放的原语,这些原语在不同的场景下使用,具有不同的特点和用途。
内存原语表格:
分配函数 | 释放函数 | 类属 | 可否重载 |
---|---|---|---|
malloc() | free() | C 函数 | 不可 |
new | delete | C++ 表达式 (expressions) | 不可 |
::operator new() | ::operator delete() | C++ 函数 | 可 |
allocator<T>::allocate() | allocator<T>::deallocate() | C++ 标准库 | 可自由设计并搭配任何容器 |
-
malloc()
和free()
:-
类属:C 函数。
-
特点:
malloc()
用于分配内存,free()
用于释放内存。这些函数是 C 语言标准库的一部分,可以在 C++ 中使用。 -
限制:不可重载。
-
-
new
和delete
:-
类属:C++ 表达式。
-
特点:
new
用于分配内存并调用构造函数,delete
用于释放内存并调用析构函数。这些表达式是 C++ 的核心内存管理工具。 -
限制:不可重载。
-
-
::operator new()
和::operator delete()
:-
类属:C++ 函数。
-
特点:
::operator new()
用于分配内存,::operator delete()
用于释放内存。这些函数可以被重载,以实现自定义的内存分配和释放逻辑。 -
限制:可重载。
-
-
allocator<T>::allocate()
和allocator<T>::deallocate()
:-
类属:C++ 标准库。
-
特点:
allocator<T>
是 C++ 标准库中的内存分配器,allocate()
用于分配内存,deallocate()
用于释放内存。这些函数可以自由设计并搭配任何容器使用。 -
限制:可自由设计并搭配任何容器。
-
三、内存管理的实际应用
在实际应用中,合理选择和使用内存管理工具可以显著提高程序的性能和可维护性。
以下是一些具体的使用场景和示例代码:
-
使用
new
和delete
:int* ptr = new int(10); // 分配内存并初始化 std::cout << *ptr << std::endl; // 输出 10 delete ptr; // 释放内存
-
使用
malloc
和free
:int* ptr = (int*)malloc(sizeof(int)); // 分配内存 *ptr = 10; // 初始化 std::cout << *ptr << std::endl; // 输出 10 free(ptr); // 释放内存
-
使用
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++ 的内存管理工具和方法。特别是对 new
、delete
、malloc
、free
以及 allocator
的使用,为后续的面向对象编程和高级开发打下了坚实的基础。
在实际编程中,合理使用这些内存管理工具可以显著提高代码的可读性和可维护性。