C++学习笔记_11_动态内存管理(对比malloc、new,free、delete)

C++学习笔记_11_动态内存管理(对比malloc、new,free、delete)

目录

    • C++学习笔记_11_动态内存管理(对比malloc、new,free、delete)
  • 内存空间分配
  • new/delete
    • 一、引出
    • 二、面试经典:
    • 三、常见错误
    • 四、operator new


内存空间分配

例题:如何一次在堆上申请4G内存?答:只能更换64位的进程。

以X32的进程为例,C/C++中程序内存区域划分如下:

C++学习笔记_11_动态内存管理(对比malloc、new,free、delete)_第1张图片
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申请空间效果一样C++学习笔记_11_动态内存管理(对比malloc、new,free、delete)_第2张图片

C++学习笔记_11_动态内存管理(对比malloc、new,free、delete)_第3张图片
但针对自定义类型:

  • 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 失败抛异常。

部分习题及答案:

  1. 变量所在哪个内存区域以及变量所占空间大小是多少?
  2. C++中关于堆和栈的说法,哪个是错误的:( )
  3. 下面有关c++内存分配堆栈说法错误的是( )
  4. 设已经有A,B,C,D4个类的定义,程序中A,B,C,D析构函数调用顺序为? ( )

你可能感兴趣的:(C++,c++,内存管理,堆栈,malloc)