简单介绍
为了能够实现动态内存分配,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去删除空指针是安全的(无事发生)