【C++】动态内存分配(new & delete)

简单介绍

为了能够实现动态内存分配,C++使用运算符new创建内存空间,用delete释放分配出去的空间

new

可以使用new分配以下三种类型的内存空间,即基本类型,类,数组

  • new int
  • new classname
  • new int[10],new classname[10]
    new所做的事情有三种:分配内存空间、调用构造函数(如果new的对象是类的话)以及提供分配空间的地址信息
    注:new 创建的是指针对象

delete

使用delete释放给定地址的内存空间(p代表需要收回空间的对象地址),以下两种的区别在于在new内存空间时使用的是单个对象还是数组

  • delete p
  • delete[] p
    如果需delete的是类对象,使用delete时先调用析构函数,再收回内存空间
    注:delete 收回空间的操作对象是指针

内存分配与收回详解

在使用new申请空间分配时,系统会有记录表记录两个信息:分配空间的地址分配空间的大小(以字节为单位),在使用delete收回内存空间时,首先系统会在记录表中找需要delete的地址:如果找到,就收回相应大小的内存空间,并在记录表中删除该条记录;如果未找到,则delete失败,运行报错。
对于类对象的delete操作,进行delete操作时首先会调用该类的析构函数,然后再收回内存空间。如果类对象是数组,那么如果使用delete,那么就只会析构数组首地址,然后当程序运行结束后收回内存;如果使用delete [],那么就会依次调用类对象数组中的析构函数,然后收回内存空间

代码演示

动态内存分配类头文件

【C++】动态内存分配(new & delete)

动态内存分配类源文件

【C++】动态内存分配(new & delete)

main函数调用

【C++】动态内存分配(new & delete)

输出结果

【C++】动态内存分配(new & delete)

Tips

  • 不要用delete去回收不是由new分配的空间
  • 不要用delete去回收已经回收过的空间
  • 使用new []去分配空间时,要用delete[]回收空间,不带[]同理
  • 使用delete去删除空指针是安全的(无事发生)