声明以下知识相关资料来自比特官网和小编手搓~C/C内存管理1、C/C内存分布2、C语言中动态内存管理方式malloc/calloc/realloc/free3、C内存管理方式3.1、new/delete操作内置类型3.2、new和delete操作自定义类型4、operator new 与 operator delete 函数5、new 和 delete 的实现原理5.1、内置类型5.2、自定义类型6、定位new表达式placement-new7、malloc/free 和 new/delete 的区别1、C/C内存分布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; 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); }2、C语言中动态内存管理方式malloc/calloc/realloc/free3、C内存管理方式C这里用独有的 new 和 delete 操作符进行内存管理。3.1、new/delete操作内置类型void Test() { // 动态申请一个int类型的空间 int* ptr4 new int; // 动态申请一个int类型的空间并初始化为10 int* ptr5 new int(10); // 动态申请10个int类型的空间 int* ptr6 new int[10]; delete ptr4; delete ptr5; delete[] ptr6; //格式一一对应 }注意申请释放一个空间 - new delete申请释放连续的空间 - new[] delete[]。3.2、new和delete操作自定义类型new/delete 和 malloc/free 的最大区别就是 new/delete 除了会开空间还会调用构造函数/析构函数。//现有一个 A类 int main() { A* p1 (A*)malloc(sizeof(A)); A* p2 new A(1); free(p1); delete p2; A* p3 (A*)malloc(sizeof(A) * 10); A* p4 new A[10]; free(p3); delete[] p4; return 0; }4、operator new 与 operator delete 函数operator new 其实就是malloc的套个公司换个名的事不过operator new解决了malloc申请完要手动验证是否申请成功operator new是不需要管的他自己会处理申请失败了会抛异常。operator delete同理也就是free套个公司换个名的事。5、new 和 delete 的实现原理5.1、内置类型内置类型对于new/delete 与 malloc/free来说基本是一样的只不过对于单个空间和连续空间用的是 new/delete 和 new[]/delete[]对于空间申请失败new是抛异常malloc是返回NULL。5.2、自定义类型new 的原理调用operator new函数申请空间再调用构造函数对申请的空间进行构造。底层malloc 构造delete 的原理先调用析构函数对申请的资源进行清理与释放。底层析构 freenew T[N] 的原理调用operator new[]函数实际是调用operator new函数申请N个对象空间在申请的空间上进行N次构造函数的执行。delete[] 的原理先调用N次析构函数对N个对象申请的资源进行清理和释放再调用operator delete[]函数实际调用operator delete函数释放空间。6、定位new表达式placement-new定位new表达式的使用场景是配合着内存池进行使用的。内存池生活费小金库妈妈每月定期给我、爸爸、姐姐生活费我们日常开销就在自己的生活费小金库里面取不需要有一笔消费。就问妈妈要。放在内存池里面的空间只是有一些空间放那我们可以找他要空间但是对于自定义类型对象要来空间的并没有调用构造函数进行初始化这个工作就交给了 定位new表达式。定位new表达式的使用方法new指针指向空间类型 / new指针指向空间类型实参初始化值int main() { A* p1 (A*)malloc(sizeof(A)); new(p1)A; p1-~A(); // 成员函数并不包含在对象里但是得通过对象去公共存储池里去调用 free(p1); A* p2 (A*)malloc(sizeof(A)); new(p2)A(10); p2-~A(); free(p2); return 0; }7、malloc/free 和 new/delete 的区别相同点在堆上申请空间用户手动释放。不同点1、malloc和free是函数new和delete是操作符。2、malloc申请空间不会初始化new会初始化。3、malloc申请空间需要计算申请空间大小new申请多个空间只要在 [] 里输入你想开的对象个数。4、malloc返回值是void*C中必须强转new不需要他后面跟的就是类型。5、malloc申请空间失败返回NULL使用时必须手动判空new不需要不过要捕获异常。6、申请自定义类型时malloc/free不会调用构造函数和析构函数new在申请空间后会调用构造函数对实例化出的对象进行初始化delete会先调用析构函数将申请的资源进行清理和释放再释放空间。
【C++笔记】内存管理流食般投喂
发布时间:2026/5/21 8:49:59
声明以下知识相关资料来自比特官网和小编手搓~C/C内存管理1、C/C内存分布2、C语言中动态内存管理方式malloc/calloc/realloc/free3、C内存管理方式3.1、new/delete操作内置类型3.2、new和delete操作自定义类型4、operator new 与 operator delete 函数5、new 和 delete 的实现原理5.1、内置类型5.2、自定义类型6、定位new表达式placement-new7、malloc/free 和 new/delete 的区别1、C/C内存分布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; 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); }2、C语言中动态内存管理方式malloc/calloc/realloc/free3、C内存管理方式C这里用独有的 new 和 delete 操作符进行内存管理。3.1、new/delete操作内置类型void Test() { // 动态申请一个int类型的空间 int* ptr4 new int; // 动态申请一个int类型的空间并初始化为10 int* ptr5 new int(10); // 动态申请10个int类型的空间 int* ptr6 new int[10]; delete ptr4; delete ptr5; delete[] ptr6; //格式一一对应 }注意申请释放一个空间 - new delete申请释放连续的空间 - new[] delete[]。3.2、new和delete操作自定义类型new/delete 和 malloc/free 的最大区别就是 new/delete 除了会开空间还会调用构造函数/析构函数。//现有一个 A类 int main() { A* p1 (A*)malloc(sizeof(A)); A* p2 new A(1); free(p1); delete p2; A* p3 (A*)malloc(sizeof(A) * 10); A* p4 new A[10]; free(p3); delete[] p4; return 0; }4、operator new 与 operator delete 函数operator new 其实就是malloc的套个公司换个名的事不过operator new解决了malloc申请完要手动验证是否申请成功operator new是不需要管的他自己会处理申请失败了会抛异常。operator delete同理也就是free套个公司换个名的事。5、new 和 delete 的实现原理5.1、内置类型内置类型对于new/delete 与 malloc/free来说基本是一样的只不过对于单个空间和连续空间用的是 new/delete 和 new[]/delete[]对于空间申请失败new是抛异常malloc是返回NULL。5.2、自定义类型new 的原理调用operator new函数申请空间再调用构造函数对申请的空间进行构造。底层malloc 构造delete 的原理先调用析构函数对申请的资源进行清理与释放。底层析构 freenew T[N] 的原理调用operator new[]函数实际是调用operator new函数申请N个对象空间在申请的空间上进行N次构造函数的执行。delete[] 的原理先调用N次析构函数对N个对象申请的资源进行清理和释放再调用operator delete[]函数实际调用operator delete函数释放空间。6、定位new表达式placement-new定位new表达式的使用场景是配合着内存池进行使用的。内存池生活费小金库妈妈每月定期给我、爸爸、姐姐生活费我们日常开销就在自己的生活费小金库里面取不需要有一笔消费。就问妈妈要。放在内存池里面的空间只是有一些空间放那我们可以找他要空间但是对于自定义类型对象要来空间的并没有调用构造函数进行初始化这个工作就交给了 定位new表达式。定位new表达式的使用方法new指针指向空间类型 / new指针指向空间类型实参初始化值int main() { A* p1 (A*)malloc(sizeof(A)); new(p1)A; p1-~A(); // 成员函数并不包含在对象里但是得通过对象去公共存储池里去调用 free(p1); A* p2 (A*)malloc(sizeof(A)); new(p2)A(10); p2-~A(); free(p2); return 0; }7、malloc/free 和 new/delete 的区别相同点在堆上申请空间用户手动释放。不同点1、malloc和free是函数new和delete是操作符。2、malloc申请空间不会初始化new会初始化。3、malloc申请空间需要计算申请空间大小new申请多个空间只要在 [] 里输入你想开的对象个数。4、malloc返回值是void*C中必须强转new不需要他后面跟的就是类型。5、malloc申请空间失败返回NULL使用时必须手动判空new不需要不过要捕获异常。6、申请自定义类型时malloc/free不会调用构造函数和析构函数new在申请空间后会调用构造函数对实例化出的对象进行初始化delete会先调用析构函数将申请的资源进行清理和释放再释放空间。