运算符 new 和 delete

mac2022-06-30  43

前言

  C语言使用函数malloc和free动态分配内存和释放动态分配的内存,但是malloc/free是库函数,只能动态的申请和释放内存,无法强制要求其做自定义类型对象构造和析构工作。然而C++使用运算符new和delete能更好的进行内存的分配与释放。但是,为了与C语言兼容,C++中仍保留了malloc和free这两个函数。

基本形式

运算符new用于内存分配的最基本的形式:

指针变量名 = new 类型 ; 指针变量名 = new 类型 (初始值) ; 指针变量名 = new 类型 [内存单元个数];

  在程序运行过程中,运算符new从称为堆的一块自由存储区中为程序分配一块与类型字节数相适应的内存空间,并将该块内存的首地址存与指针变量中。

int * p; p = new int;

运算符deleteyongyu释放运算符new分配的存储空间。其基本形式为:

delete 指针变量名 ;

new的优点

使用malloc函数时必须使用sizeof函数来计算所需要的字节数,而new可以根据数据类型自动计算所要分配内存的大小,这就减少了发生错误的可能性。new能够自动返回正确的数据类型,而不必像malloc函数那样,必须在程序中进行强制类型转换,才能使其返回正正确的指针类型。 有关C语言中malloc和free函数详见https://blog.csdn.net/qinshaang/article/details/96429426

new和delete的使用说明

使用new可以为数组动态分配内存空间,这时需要在类型名后面缀上数组大小。例如: int * pi = new int[10];

  但是,new不能对动态分配的数组存储区进行初始化。

释放动态分配数组存储区时,可以用如下形式:

delete [ ] 指针变量名 ;

使用new动态分配内存时,如果没有足够的内存满住分配需要,则动态分配空间失败,有些编译系统将返回空指针NULL;因此可以对内存的动态分配是否成功进行检查。new和delete不仅承载着内存分配的功能还承载着对象构造函数的调用功能,其形式为:

类名 * 指针变量名 = new 类名 [ ( 实参表 ) ] ;

  调用new编译系统会开辟一段内存空间存放类对象,同时调用该类的构造函数对数据成员赋初值。这个对象没有名字,称为无名对象。但是该对象有地址,该地址存放在指针中。当new建立的对象使用结束,用delete运算符予以释放。

C++允许重载new/delete操作符,布局new的就不需要为对象分配内存,而是指定了一个地址作为内存起始区域,new在这段内存上为对象调用构造函数完成初始化工作,并返回此地址。而malloc不允许重载。
最新回复(0)