【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 []
,那么就会依次调用类对象数组中的析构函数,然后收回内存空间
代码演示
动态内存分配类头文件
动态内存分配类源文件
main函数调用
输出结果
Tips
- 不要用
delete
去回收不是由new
分配的空间 - 不要用
delete
去回收已经回收过的空间 - 使用
new []
去分配空间时,要用delete[]
回收空间,不带[]
同理 - 使用
delete
去删除空指针是安全的(无事发生)