【C++】new/delete 还是 malloc/free?C++内存管理的“世纪抉择

📅 2026/6/24 12:45:14
【C++】new/delete 还是 malloc/free?C++内存管理的“世纪抉择
目录一计算机的内存的存储1内存划分2类型的判断3C语言中的动态内存管理二C当中的内存管理方式1new和delete的使用2new和delete的底层实现原理3定位new表达式三总结 malloc/free和new/delete之间的区别一计算机的内存的存储1内存划分首先看下面这张图这张图片展示了C/C程序内存区域的各个部分栈的内存由高到低进行开辟而堆的内存由低到高进行开辟。内存空间在不同位下的效果2类型的判断globalvar全局变量在静态区staticGlobalvar:静态全局变量也在静态区这两个的核心区别就是全局变量可以在这个工程下的其他文件中进行使用但是静态修饰的变量只能在当前文件下进行使用。staticvar:静态的局部变量也在静态区localvar/num1/char2局部变量和数组都在栈中*char2表示首元素依旧在栈中pchar3:常量字符串指针在栈中*pchar3表示常量字符串在代码段当中ptr1表示开辟空间的指针在栈中*ptr1表示开辟的空间在堆中3C语言中的动态内存管理在学习C中的内存管理函数之前需要先复习一下C语言当中的内存管理函数。C语言当中内存管理malloc/calloc/realloc/free二C当中的内存管理方式1new和delete的使用虽然C语言当中动态开辟内存的方式在C当中依然可以进行使用但是C开创了自己内存管理的方式即通过new和delete操作符进行动态内存管理内置类型的动态内存开辟自定义类型的内存开辟总结在申请空间时new会调用构造函数 delete会调用析构函数但是malloc和free不会除此之外malloc会进行判空防止开辟失败new开辟空间失败会抛出异常。展示32位下由此可见32位下在堆上申请1.8G左右的内存而栈上一般申请8MB左右的内存2new和delete的底层实现原理要想了解new和delete的底层原理就要先知道operator new和operator delete函数首先new和delete是用户开辟空间和释放空间的操作符operator new和operator delete是系统提供的底层函数new在底层调用operator newdelete在底层调用operator delete全局函数来释放空间。operator new 的底层还是malloc,如果申请成功就返回如果申请失败就抛出异常operator delete的底层还是free来释放空间自定义类型new的原理1调用operator new函数申请空间2在申请的空间上使用构造函数进行初始化delete的原理1调用析构函数清理对象当中开辟的资源和空间。2调用operator delete函数释放对象中的空间。注意自定义类型new/free,malloc/delete不能进行混用可能会出现内存泄漏等问题。总结不要错配使用new/delete搭配malloc/calloc/realloc/free搭配3定位new表达式在某些时候我们将new的两个组成部分进行拆分使用就要用到new表达式new表达式在已经分配的内存空间中调用构造函数并初始化一个对象 。使用形式new(对象名)对象类型向构造函数传入的值展示class A { public: A(int a 0) :_a(a) { cout A(): this endl; } ~A() { cout ~A: this endl; } private: int _a; }; int main() { A* p1 new A(1); delete p1; //进行拆分--调用operator new相当于malloc A* p2 (A*)operator new(sizeof(A)); //定位new表达式--在已经分配内存的空间中调用构造函数并初始化为2 new(p2)A(2); //可以直接通过指针调用析构函数 p2-~A(); operator delete(p2); return 0; }定位new表达式的使用场景比较少一般是配合内存池进行使用了解一下即可。三总结 malloc/free和new/delete之间的区别共同点malloc/free和new/delete的共同点就是都需要从堆申请空间并且需要手动释放空间。不同点对比项malloc/freenew/delete语言C/CC类型函数运算符调用构造/析构❌ 不调用✅ 调用返回值类型void*需强转类型安全不需要进行强转失败处理返回NULL手动判空抛异常自动抛出内存大小手动计算自动计算数组支持无特殊支持new[]/delete[]直接通过个数开辟可重载否是分配失败可扩容可通过realloc调整无直接对应需自己实现malloc/free是标准库函数标准库函数不能够进行重载但是new/delete是操作符操作符可以进行重载。