内存分布
在C语言和C++中,程序内存被划分成六个部分:
内核空间、栈、内存映射段、堆、数据段、代码段
栈:又称堆栈,主要为非静态局部变量、函数参数、返回值等,栈的生长方向是向下生长的
内存映射段:高效的I/O映射方式,用于装载一个共享的动态内存库。用户可以使用系统接口创建共享内存,用做进程间通信
堆:用于程序运行时的动态内存分配,堆的生长方向是向上生长的
数据段:储存全局数据和静态数据
代码段:储存可执行的代码、只读常量(const)
new、delete
new与malloc函数等C语言中开辟空间的操作不同的是,new不需要自行计算空间大小和返回类型,同时在使用new进行自定义类型的空间开辟时,它会自动调用默认构造函数完成初始化
delete与free等不同之处在于:delete会自动调用自定义类型的析构函数
在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与 free不会
申请和释放单个元素的空间,使用new和delete操作符
申请和释放连续的空间,使用 new[] 和delete[]
operator new与operator delete
operator new和operator delete为系统定义的全局函数
new和delete在底层分别调用了operator new和operator delete用来申请和释放空间
operator new实际通过malloc来申请空间,当malloc申请成功时直接返回,失败时抛异常
operator delete实际通过free来释放空间,成功时直接返回,失败时返回NULL
new的原理:先用operator new申请空间,在申请的空间上执行构造函数,完成对象的构造
delete的原理:在申请的空间上执行析构函数,完成对象的资源清理,再用operator delete释放空间
new T[N]的原理:先用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请,再在申请的空间上执行N次构造函数
delete[]的原理:先在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理,再调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间
malloc/free与new/delete的区别
共同点:都是从堆上申请空间,需要用户手动释放空间
不同点:1.malloc与free为函数,new与delete为操作符
2.malloc申请的空间不会初始化,new会初始化
3.malloc申请空间时需要手动计算空间大小并传递,new只需要在后面跟上空间的类型,若是申请多个对象,[]中指定对象个数即可
4.malloc返回值为void*,必须强制类型转化,new不需要
5.malloc申请空间失败时返回的NULL,使用时必须判空,new不需要判空但必须捕获异常
6.申请自定义类型对象时,new/delete会执行默认的构造函数和析构函数,完成对象的初始化或资源释放,而malloc/free不会