目录
C++内存区域划分
1)栈,又叫堆栈,存放非静态局部变量、函数参数、返回值等,栈是向下增长的(提高空间利用率)。
2)内存映射段,是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。
3)堆,动态分配内存,向上增长。
4)数据段,存储全局数据和静态数据。
5)代码段,存放可执行代码、只读常量。
C++内存管理方式
通过new和delete进行动态管理。
1)申请和释放单个内存空间,使用new和delete 。
2)申请和释放连续内存空间,使用new[ ]和delete[ ]。
3)切记匹配起来使用,否则可能会出现意想不到的结果。
new
1)对于内置类型,new和malloc几乎没啥区别。
2)对于自定义类型,new会调用相应的构造函数,malloc不会。
delete
1)对于内置类型,delete和free几乎没啥区别。
2)对于自定义类型,delete会调用析构函数完成对象中资源的清理,free不会。
operator new和operator delete
1)operator new 和operator delete是系统提供的全局函数。
2)new在底层调用operator new来申请空间,delete在底层调用operator delete来释放空间。
3)operator new实际上是通过malloc来申请空间,operator delete实际上是通过free来释放空间。
4)operator new和operator delete是对malloc和free的封装。
new和delete的实现原理
对于内置类型:
1)new和malloc,delete和free基本类似。
2)new和delete申请和释放的是单个元素的空间,new[ ]和delete[ ]申请和释放的是连续的多个元素空间。
对于自定义类型:
●new的原理
1)调用operator new,operator new调用malloc申请空间。
2)在申请的空间上执行构造函数,完成对象的构造。
●delete的原理
1)在空间上执行析构函数,完成对象中资源的清理。
2)调用operator delete,operator delete调用free释放空间。
●new T[ N ]的原理
1)operator new[ ]调用operator new,operator new调用malloc开辟空间。
2)在申请的空间上执行N次构造函数。
●delete[ ]的原理
1)在释放的空间上执行N次析构函数,完成N个对象中资源的清理。
2)delete[ ] 调用operator delete,operator delete调用free释放空间。
定位new
作用:在已分配的内存空间调用构造函数来初始化对象。
格式:new(地址)type或new(地址)type(初始化列表)。
演示:
A* p1 = (A*)malloc(sizeof(A));
new(p1)A; //如果A类的构造函数有参数,则需要传参
p1->~A();
free(p1);
A* p2 = (A*)operator new(sizeof(A));
new(p2)A(10);
p2->~A();
operator delete(p2);
malloc/free和new/delete的区别
1)malloc和free是函数,new和delete是操作符。
2)malloc申请的空间不会初始化,new申请的空间可以初始化。
3)malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可,如果是多个对象,在[ ]中指定即可。
4)malloc的返回值为void*,在使用时必须强转,new不需要,因为new后跟着就是空间的类型。
5)malloc失败会返回NULL,new失败会抛异常。
6)申请自定义类型时,malloc和free只会开辟和释放空间,不会调用构造函数与析构函数,而new在申请空间时会调用构造函数完成对象的初始化,delete在释放空间前,会调用析构函数完成对象中资源的清理。
完