知识点32C 内存分布说明1栈又叫堆栈-非静态局部变量/函数参数/返回值等等栈是向下增长的。2内存映射段是高效的I/O映射方式用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存做进程间通信。3堆用于程序运行时动态内存分配堆是向上增长的。4数据段-存储全局数据和静态数据。5代码段-可执行的代码/只读常量。知识点33C 语言中动态内存管理方式malloc / calloc / realloc / freemalloc只申请不初始化calloc申请并清零realloc调整已有空间大小free释放动态内存。知识点34C 内存管理方式C 语言的内存管理方式在C 中可继续使用但有些地方使用起来比较麻烦因此C 提出了自己的内存管理方式通过 new 和 delete 操作符进行动态内存管理。new / delete 的实现原理1.内置类型如果申请的是内置类型的空间new 和 malloc delete 和 free 基本类似不同的地方是new / delete 申请和释放的是单个元素空间new[] 和 delete[] 申请和释放的是连续空间而且 new 在申请失败时会抛异常。2.自定义类型new的原理1. 调用operator new函数申请空间2. 在申请的空间上执行构造函数完成对象的构造delete的原理1. 在空间上执行析构函数完成对象中资源的清理工作2. 调用operator delete函数释放对象的空间new T[N]的原理1. 调用operator new[]函数在operator new[]中实际调用operator new函数完成N个对象空间申请2. 在申请的空间上执行N次构造函数delete[]的原理1. 在释放的对象空间上执行N次析构函数完成N个对象中资源的清理2. 调用operator delete[]释放空间实际在operator delete[]中调用operator delete来释放空间new / delete 操作内置类型void Test() { //动态申请一个 int 类型空间 int* ptr1 new int; //动态申请一个 int 类型空间并初始化为10 int* ptr2 new int(10); //动态申请10个 int 类型空间 int* ptr3 new int[10]; int* ptr4 new int[10]{1, 2, 3}//前三个位置分别为1、2、3后面都初始化为0 delete ptr1; delete ptr2; delete[] ptr3; }new / delete 操作自定义类型malloc是单纯开空间new 是开空间构造函数初始化(在申请自定义类型空间时)free 单纯释放空间delete 是析构函数释放空间(在申请自定义类型空间时)。class A { public: A(int a 0) :_a(a) { cout A(): this endl; } ~A() { cout ~A(): this endl; } private: int _a; }; int main() { //new/delete 和 malloc/free 最大区别是前者对于自定义类型除了开空间与释放空间还会调用构造函数和析构函数 A* p1 (A*)malloc(sizeof(A)); A* p2 new A(1); free(p1); delete p2; //内置类型 int* p3 (int*)malloc(sizeof(int)); int* p4 new int; free(p3); delete p4; A* p5 (A*)malloc(sizeof(A)*10); A* p6 new A[10]; free(p5); delete[] p6; return 0; }知识点35operator new 和 operator delete 函数operator new 和 operator delete 函数是系统提供的全局函数可以理解为 new/ delete 函数的开空间与释放空间的部分类似malloc / free ,实际上其底层就是调用 malloc/ free 函数。知识点36定位 new 表达式(placement-new)定位 new 表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。一般配合内存池使用因为内存池分配的内存没有初始化所以如果是自定义类型的对象需要使用 new 定位表达式来显示调用构造函数进行初始化。使用格式new (空间地址-指针) type 或者 new (空间地址-指针) type(初始化列表)#include iostream #include new #include cstdlib struct X { int value; X(int v) : value(v) { std::cout X constructor\n; } ~X() { std::cout X destructor\n; } }; int main() { void* mem std::malloc(sizeof(X)); // 只分配原始内存 X* p new (mem) X(42); // 在 mem 上构造 X 对象 std::cout p-value \n; p-~X(); // 手动析构 std::free(mem); // 释放原始内存 }
学习C++ Day 07
发布时间:2026/7/4 3:21:35
知识点32C 内存分布说明1栈又叫堆栈-非静态局部变量/函数参数/返回值等等栈是向下增长的。2内存映射段是高效的I/O映射方式用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存做进程间通信。3堆用于程序运行时动态内存分配堆是向上增长的。4数据段-存储全局数据和静态数据。5代码段-可执行的代码/只读常量。知识点33C 语言中动态内存管理方式malloc / calloc / realloc / freemalloc只申请不初始化calloc申请并清零realloc调整已有空间大小free释放动态内存。知识点34C 内存管理方式C 语言的内存管理方式在C 中可继续使用但有些地方使用起来比较麻烦因此C 提出了自己的内存管理方式通过 new 和 delete 操作符进行动态内存管理。new / delete 的实现原理1.内置类型如果申请的是内置类型的空间new 和 malloc delete 和 free 基本类似不同的地方是new / delete 申请和释放的是单个元素空间new[] 和 delete[] 申请和释放的是连续空间而且 new 在申请失败时会抛异常。2.自定义类型new的原理1. 调用operator new函数申请空间2. 在申请的空间上执行构造函数完成对象的构造delete的原理1. 在空间上执行析构函数完成对象中资源的清理工作2. 调用operator delete函数释放对象的空间new T[N]的原理1. 调用operator new[]函数在operator new[]中实际调用operator new函数完成N个对象空间申请2. 在申请的空间上执行N次构造函数delete[]的原理1. 在释放的对象空间上执行N次析构函数完成N个对象中资源的清理2. 调用operator delete[]释放空间实际在operator delete[]中调用operator delete来释放空间new / delete 操作内置类型void Test() { //动态申请一个 int 类型空间 int* ptr1 new int; //动态申请一个 int 类型空间并初始化为10 int* ptr2 new int(10); //动态申请10个 int 类型空间 int* ptr3 new int[10]; int* ptr4 new int[10]{1, 2, 3}//前三个位置分别为1、2、3后面都初始化为0 delete ptr1; delete ptr2; delete[] ptr3; }new / delete 操作自定义类型malloc是单纯开空间new 是开空间构造函数初始化(在申请自定义类型空间时)free 单纯释放空间delete 是析构函数释放空间(在申请自定义类型空间时)。class A { public: A(int a 0) :_a(a) { cout A(): this endl; } ~A() { cout ~A(): this endl; } private: int _a; }; int main() { //new/delete 和 malloc/free 最大区别是前者对于自定义类型除了开空间与释放空间还会调用构造函数和析构函数 A* p1 (A*)malloc(sizeof(A)); A* p2 new A(1); free(p1); delete p2; //内置类型 int* p3 (int*)malloc(sizeof(int)); int* p4 new int; free(p3); delete p4; A* p5 (A*)malloc(sizeof(A)*10); A* p6 new A[10]; free(p5); delete[] p6; return 0; }知识点35operator new 和 operator delete 函数operator new 和 operator delete 函数是系统提供的全局函数可以理解为 new/ delete 函数的开空间与释放空间的部分类似malloc / free ,实际上其底层就是调用 malloc/ free 函数。知识点36定位 new 表达式(placement-new)定位 new 表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。一般配合内存池使用因为内存池分配的内存没有初始化所以如果是自定义类型的对象需要使用 new 定位表达式来显示调用构造函数进行初始化。使用格式new (空间地址-指针) type 或者 new (空间地址-指针) type(初始化列表)#include iostream #include new #include cstdlib struct X { int value; X(int v) : value(v) { std::cout X constructor\n; } ~X() { std::cout X destructor\n; } }; int main() { void* mem std::malloc(sizeof(X)); // 只分配原始内存 X* p new (mem) X(42); // 在 mem 上构造 X 对象 std::cout p-value \n; p-~X(); // 手动析构 std::free(mem); // 释放原始内存 }