new
1:C++ new/delete是运算符,不是函数,没有头文件,不要头文件。
2:new 语法格式
(1): 指针 = new 类型;
(2): 指针 = new 类型(初始表达式);
(3): 指针 = new 类型 【元素个数】;
举例:
(1): int *a = new int;
申请内存,定义int变量.即开辟一个存放整数的存储空间,返回一个指向该存储空间的地址 (即指针 ) 。
(2): int *a = new int(100);
申请内存,定义int变量,并初始化为100.即开辟一个存放整数的空间,并指定该整数的初值为100,返回一个指向该 存储
空间的地址。
(3): int *a = new int[100];
申请内存,定义int[100]数组变量,即开辟一个存放字符数组 (包括 10 个元素 )的空间,返回首元素的地址。
(4): 当然二维数组,其他类型皆可
如:int **a = new int[5][6];
float *p=new float (3.14159);等等…
注意:如果由于内存不足等原因而无法正常分配空间,则 new 会返回一个空指针 NULL,用户可以根据该指针的值判断分配空间是否成功。即需要用户简单判断返回值。
储存机制
两种形式定义的目的一样的,即分配int[10]
红1:更为简单,也不需要判断内存是否分配成功。
这种定义-----实际上是在栈内,但是栈的实际内存是连续内存,因此可分配空间较小。
红2:
主要应用于内存的动态分配,
如果定义a[10000000]或者更大的话,应该选用后者,因为实际定义在堆内,堆可以是非连续内存,可以分配较大内存。
因此,如果需要分配较大内存,需要分配在堆上。
delete
1:new和delete必须配对使用,delete只能释放堆空间。使用时要防止内存泄漏(memory leak)和重复释放。
如果new返回的指针值丢失,则所分配的堆空间无法回收,称内存泄漏。
同一空间重复释放也是危险的,因为该空间可能已另分配,
所以必须妥善保存new返回的指针,以保证不发生内存泄漏,也必须保证不会重复释放堆内存空间。
2:delete语法格式
(1):delete 指针
int *a = new int;
delete a; //释放单个int的空间
(2):delete []指针
int *a = new int[5];
delete []a; //释放int数组空间