C++学习笔记_11_动态内存管理(对比malloc、new,free、delete)
内存空间分配
例题:如何一次在堆上申请4G内存?答:只能更换64位的进程。以X32的进程为例,C/C++中程序内存区域划分如下:
32位进程空间=4G=4×1024 M=4×1024×1024 kb=4×1024×1024×1024 Byte
其中:
- 栈:非静态局部变量、返回值、函数参数
- 内存映射段:
- 堆:用于程序运行时动态内存分配,向上增长。malloc、new等都在堆上
- 数据段:存储全局数据和静态数据
- 代码段:可执行的代码、只读常量
new/delete
一、引出
C语言已经有了malloc/free等接口函数去堆上申请释放空间?C++为什么还需要new/delete?
针对内置类型,使用malloch和new申请空间效果一样
但针对自定义类型:
- malloc和free只管开空间+释放空间
- new和delete开空间+构造函数初始化+析构函数+释放空间
二、面试经典:
new/delete对比malloc/free最重要的区别?
1.用法区别
- new/delete是操作符,malloc/free是函数
- new/delete不需要强转,malloc/free需要强转
- new/delete传的参数是类型长度,malloc/free参数是分配的内存的字节数
2.是否调用构造函数、析构函数
- new/delete调用,malloc/free不用
三、常见错误
- 忘记检查所请求的内存是否分配成功。
- 操作内存时超出了分配内存的边界。
四、operator new
operator new就是函数名,不是new/delete重载
用法与malloc/free相同
operator new 和 malloc 区别:
- C语言处理错误的方式一般是返回错误码,所以malloc失败返回0
- C++处理错误失败的方式一般抛出异常,所以operator new 和 new 失败抛异常。
部分习题及答案:
- 变量所在哪个内存区域以及变量所占空间大小是多少?
- C++中关于堆和栈的说法,哪个是错误的:( )
- 下面有关c++内存分配堆栈说法错误的是( )
- 设已经有A,B,C,D4个类的定义,程序中A,B,C,D析构函数调用顺序为? ( )
转载:https://blog.csdn.net/kris_paul/article/details/115868214
查看评论