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++中new/delete与C语言中malloc/free的区别,详细解析了它们在内存分配、构造函数调用等方面的不同,并介绍了operator new的使用场景。
2039

被折叠的 条评论
为什么被折叠?



