目录
在C语言中,动态开辟空间使用可以使用库函数malloc,在C++中仍然可以这样做,但在C++中有更好的方法——运算符new
new的使用
使用new分配内存的通用格式如下
typeName * pointer_name = new typeName;
以下是一些new常用的场景
int* p1 = new int; //new一个int类型
delete p1;
int* p2 = new int(1);//new一个int类型,并且初始化为1
delete p2;
int* p3 = new int[10];//new一个有十个元素的int数组
delete[]p3;
int* p4 = new int[10]{ 1,2,3,4,5,6,7,8,9,10 };//new一个有十个元素的int数组,并且初始化
delete[]p4;
A* p5 = new A;//new一个A对象
delete p5;
new相对于malloc的优势
1.malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可
new实现的实质
1.内置类型
在内置类型中,new和malloc是类似的,不同之处有两点
1.new能够对申请空间进行初始化,操作如下:
int* p = new int(1);//申请一个int空间并且初始化为1
2.new申请失败抛出异常,malloc申请失败返回NULL
2.自定义类型
在自定义类型中
new = operator new + 构造函数
operator new 是一个开辟空间的函数,实际上他开辟空间使用的也是malloc,但是在面向对象编程中malloc不太适用,反而抛出异常的方式更加合理,因此使用 operator new 对malloc 进行了封装,让他 成为了抛出异常的开辟空间函数。
delete = 析构函数 + operator delete
与operator new 类似 ,operator delete 是对free的封装 ,使其符合C++使用的预期。
delete使用
有new的地方,一定会有与之对应的delete,用于释放new申请的空间
虽然在程序终止时,操作系统会自动释放开辟的动态空间,但是在长期运行的程序中,如果不谨慎使用new / delete,往往会造成内存泄露。因此我们使用new,一定要配套使用delete,并且delete只能释放new申请的空间。
常用格式如下
int* p1 = new int; //new一个int类型
delete p1;//释放开辟的int空间
int* p3 = new int[10];//new一个有十个元素的int数组
delete[]p3;//释放开辟的int数组空间
A* p5 = new A;//new一个A对象
delete p5;//释放开辟的A对象空间