百度推广网站备案,ai智能建站,wordpress缺少功能,wordpress文章编辑软件文章目录程序区域内存划分C语言动态内存分配#xff1a;new和delete#xff1a;new、delete和malloc、free的区别:程序区域内存划分
C/C程序内存区域划分非常相似。 C语言动态内存分配#xff1a;
malloc、calloc、realloc都是C语言动态开辟内存的常用函数 其中 malloc 开…
文章目录程序区域内存划分C语言动态内存分配new和deletenew、delete和malloc、free的区别:程序区域内存划分
C/C程序内存区域划分非常相似。 C语言动态内存分配
malloc、calloc、realloc都是C语言动态开辟内存的常用函数 其中 malloc 开辟一块空间不会对这块空间进行初始化而calloc会初始化这块空间为0realloc则在需要扩充空间时使用。 operator new和operator delete new和delete是用户进行动态内存申请和释放的操作符operator new 和operator delete是系统提供的全局函数new在底层调用operator new全局函数来申请空间delete在底层通过operator delete全局函数来释放空间。
而operator new 和 operator delete 底层依然是调用malloc和free实现的。 new和delete
对于内置类型 new和mallocdelete和free基本类似不同的地方是 new/delete申请和释放的是单个元素的空间new[]和delete[]申请的是连续空间而且new在申请空间失败时会抛异常malloc会返回NULL。
除此之外new可以在申请空间后赋值。
int* p1 new int;
int* p2 new int(2);//赋值
int* p3 new int[3];
int* p4 new int[3]{1,2,3};//赋值
对于自定义类型
new 1、先调用operator new申请一块空间 2、调用构造函数初始化delete 1、先调用析构函数完成对象内空间释放 2、调用operator delete删除对象new[] 1、先调用operator new[] 实际调用operator new完成N次对象空间的申请 2、调用N次构造函数初始化delete[] 1、先调用N次析构函数完成对象内空间释放完成对象空间内资源的释放 2、调用operator delete[]实际上调用operator delete删除N个对象 定位new表达式 格式new (指针) type(初始化列表) type指对象的类型 定位new表达式在实际中一般是配合内存池使用。因为内存池分配出的内存没有初始化所以如果是自定义类型的对象需要使用new的定义表达式进行显示调构造函数进行初始化。
int main()
{A* p1 (A*)malloc(sizeof(A));new(p1)A(1);// 注意如果A类的构造函数有参数时此处需要传参p1-~A();free(p1);
}new、delete和malloc、free的区别: 1、new能初始化malloc不行 2、new/delete是操作符而malloc/free是函数 3、new申请空间不需要计算大小malloc需要手动计算 4、new后跟空间类型不需要强制类型转换malloc需要 5、new失败后需要捕获异常malloc失败返回NULL 6、new/delete会调用构造函数/析构函数完成初始化/对象空间资源清理而malloc不会。