一:C与C++的内存区域划分
C与C++的内存区域划分都是一样的,都把内存空间划分为六个区域:
内核空间 | |
栈 | 函数,以及局部变量 |
内存映射段 | |
堆 | 动态申请内存(molloc,relloc等) |
数据段(静态区) | 静态变量,全局变量(static等) |
代码段(常量区) | 常量 |
二:C与C++的动态内存管理的介绍
C++兼容C语言的内存管理方式,简单回顾C语言动态内存管理方式:
malloc | (类型)malloc(类型*个数) |
calloc | (类型)calloc(创建个数,类型)(会自动初始化为0) |
realloc | (类型)realloc(原先的地址,进行空间操作之后的内存大小) |
free | free(要销毁的变量) |
在C++中重新引用进了两个操作符:new,delete.
用法:new+类型(初始化的值)/ new+类型[个数]{要初始化的值}
delete +变量 / delete[要进行销毁的个数] +变量
PS:一般情况下,new对所创建的不进行初始化,但是可以自己手动对其进行初始化,并且操作符除了用法方便,与C的用法无太大差别
对于自定义类型,new和delete的优势才真正地显现出来
功能:对于自定义类型,使用new时会自动调用构造函数,使用delete会自动调用析构函数
扩容:C++在进行扩容时,没有使用realloc的概念,而是自己手动地对其进行扩容
三:operator new与operator delete函数
PS:operator new 与operator delete 为两个全局函数,实际上是malloc与free的封装
例如:A* p2 = new A ; == operator new(本质还是在使用malloc在开空间) + 构造函数
delete p2; == 析构函数 + operator delete
四:C与C++内存管理的区别
C与C++的动态内存管理主要区别是在底层调用的时候
(1)C++在动态申请内存时,如果失败会直接抛异常,不需要再进行返回值的检查(主要是因为其是封装了malloc+抛异常)
(2)C语言的动态申请内存是使用函数,而C++使用的是两个操作符
PS:最好C语言的和C语言的配套使用,C++的和C++的进行配套使用
原因:使用new的时候有时会多开空间存放要创建的对象个数,提醒后面要进行调用析构函数的次数,但往往返回值会往后移四个字节,此时如果使用free会造成内存泄漏
(显式写出析构函数的情况下会多开空间,只有delete[] 会自动向前偏移四个字节的位置)