您的位置:首页 > 编程语言 > C语言/C++

C++中new和delete的用法

2016-04-13 11:36 162 查看
首先,new和delete运算符是用于动态分配和撤销内存的运算符。

一、new用法

  1.开辟单变量地址空间

  使用new运算符时必须已知数据类型,new运算符会向系统堆区申请足够的存储空间,如果申请成功,就返回该内存块的首地址,如果申请不成功,则返回零值。

  new运算符返回的是一个指向所分配类型变量(对象)的指针。对所创建的变量或对象,都是通过该指针来间接操作的,而动态创建的对象本身没有标识符名。

  一般使用格式:

**格式1:指针变量名=new 类型标识符;

格式2:指针变量名=new 类型标识符(初始值);

格式3:指针变量名=new 类型标识符 [内存单元个数];**

  说明:格式1和格式2都是申请分配某一数据类型所占字节数的内存空间;但是格式2在内存分配成功后,同时将一初值存放到该内存单元中;而格式3可同时分配若干个内存单元,相当于形成一个动态数组。例如:

  1)new int; //开辟一个存放整数的存储空间,返回一个指向该存储空间的地址。int *a = new int 即为将一个int类型的地址赋值给整型指针a

  2)int *a = new int(5) 作用同上,但是同时将整数空间赋值为5

  2.开辟数组空间

  对于数组进行动态分配的格式为:

  指针变量名=new 类型名[下标表达式];

delete [ ] 指向该数组的指针变量名;

  两式中的方括号是非常重要的,两者必须配对使用,如果delete语句中少了方括号,因编译器认为该指针是指向数组第一个元素的指针,会产生回收不彻底的问题(只回收了第一个元素所占空间),加了方括号后就转化为指向数组的指针,回收整个数组。

  delete []的方括号中不需要填数组元素数,系统自知。即使写了,编译器也忽略。

  请注意“下标表达式”不必是常量表达式,即它的值不必在编译时确定,可以在运行时确定。

  一维: int *a = new int[100]; //开辟一个大小为100的整型数组空间

  二维: int **a = new int[5][6]

  三维及其以上:依此类推.

 二、delete用法

  1. 删除单变量地址空间

  int *a = new int;

  delete a; //释放单个int的空间

  2. 删除数组空间

  int *a = new int[5];

  delete []a; //释放int数组空间

  三、使用注意事项

  1. new 和delete都是内建的操作符,语言本身所固定了,无法重新定制,想要定制new和delete的行为,徒劳无功的行为。

  2. 动态分配失败,则返回一个空指针(NULL),表示发生了异常,堆资源不足,分配失败。

  3. 指针删除与堆空间释放。删除一个指针p(delete p;)实际意思是删除了p所指的目标(变量或对象等),释放了它所占的堆空间,而不是删除p本身(指针p本身并没有撤销,它自己仍然存在,该指针所占内存空间并未释放),释放堆空间后,p成了空指针。

  4. 内存泄漏(memory leak)和重复释放。new与delete 是配对使用的, delete只能释放堆空间。如果new返回的指针值丢失,则所分配的堆空间无法回收,称内存泄漏,同一空间重复释放也是危险的,因为该空间可能已另分配,所以必须妥善保存new返回的指针,以保证不发生内存泄漏,也必须保证不会重复释放堆内存空间

  5. 动态分配的变量或对象的生命期。我们也称堆空间为自由空间(free store),但必须记住释放该对象所占堆空间,并只能释放一次,在函数内建立,而在函数外释放,往往会出错。

  6. 要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问。

  

用new和delete可以动态开辟和撤销地址空间。在编程序时,若用完一个变量(一般是暂时存储的数据),下次需要再用,但却又想省去重新初始化的功夫,可以在每次开始使用时开辟一个空间,在用完后撤销它。???

7.指针变量名=new 类型标识符(初始值),这个用法要注意初始化时不能超过分配的内存大小,如下错误的初始化方法:

char *zf = new char(“Hello”);

char *zp = new char[6];

zp = “Hello”;

8.多维数组:

int (*p2)[10] = new int[2][10];

int (*e)[2][3] = new int[34][2][3];

9.运算符new会自动调用类的构造函数。

10.malloc和free

1)malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。

2)对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。

3)因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

4)C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。

5)new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。

而malloc和free从不调用构造和析构函数,他们只是简单的分配内存
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: