浅谈C++中new以及delete使用
来源:互联网 发布:一卡通食堂软件系统 编辑:程序博客网 时间:2024/05/16 05:35
对于计算机程序设计而言,变量和对象在内存中的分配都是编译器在编译程序时安排好的,这带来了极大的不便,如数组必须大开小用,指针必须指向一个已经存在的变量或对象。对于不能确定需要占用多少内存的情况,动态内存分配解决了这个问题。
对于个人感触最深的就是数组了,数组有三个重要的限制:(1)数组长度固定不变;(2)在编译时必须知道数组的长度;(3)数组只在定义它的块语句内存在。实际的程序往往不能忍受这样的限制——它们希望在运行时动态地分配数组。虽然数组长度是固定的,但动态分配的数组不必在编译时知道其长度,通常在运行时才确定数组的长度。与数组变量不同,动态分配的数组将一直存在,直到程度显示释放它为止。
每一个程度在运行时都会占用一块可用的内存,用于存放动态分配的对象,此内存空间被称为程序的自由存储空间或者堆。C语言使用一对标准的库函数malloc和free在自由存储空间中分配存储空间。而在C++中new和delete运算符是用于动态分配和撤销内存的运算符。
一、new用法
1.开辟单变量地址空间
使用new运算符时必须已知数据类型,new运算符会向系统堆区申请足够的存储空间,如果申请成功,就返回该内存块的首地址,如果申请不成功,则返回零值。new运算符返回的是一个指向所分配类型变量(对象)的指针。对所创建的变量或对象,都是通过该指针来间接操作的,而动态创建的对象本身没有标识符名。
一般使用格式:
说明:格式1和格式2都是申请分配某一数据类型所占字节数的内存空间;但是格式2在内存分配成功后,同时将一初值存放到该内存单元中;而格式3可同时分配若干个内存单元,相当于形成一个动态数组。例如:
1)new int;
2)int *a = new int(5) 作用同上,但是同时将整数空间赋值为5
2.开辟数组空间
对于数组进行动态分配的格式为:
指针变量名=new 类型名[下标表达式];
delete [ ] 指向该数组的指针变量名;
两式中的方括号是非常重要的,两者必须配对使用,如果delete语句中少了方括号,因编译器认为该指针是指向数组第一个元素的指针,会产生回收不彻底的问题(只回收了第一个元素所占空间),加了方括号后就转化为指向数组的指针,回收整个数组。delete []的方括号中不需要填数组元素数,系统自知。即使写了,编译器也忽略。
请注意“下标表达式”不必是常量表达式,即它的值不必在编译时确定,可以在运行时确定。
一维: int *a = new int[100];
二维: int **a = new int[5][6]
三维及其以上:依此类推.
一般用法: new 类型 (初值)
二、delete用法
1. 删除单变量地址空间
int *a = new int;
delete a;
2. 删除数组空间
int *a = new int[5];
delete []a;
对于delete与delete[]可以用如下一个简单的实例来说明其差异。
- #include <iostream>
- using namespace std;
- /////////class Babe
- class Babe
- {
- public:
- Babe()
- {
- cout << \"Create a Babe to talk with me\" << endl;
- }
- ~Babe()
- {
- cout << \"Babe don\'t go away,listen to me\" << endl;
- }
- };
- //////////main function
- int main()
- {
- Babe* pbabe = new Babe[3];
- delete pbabe;
- pbabe = new Babe[3];
- delete pbabe[];
- return 0;
- }
结果是:
Create a babe to talk with me
Create a babe to talk with me
Create a babe to talk with me
Babe don\'t go away,listen to me
Create a babe to talk with me
Create a babe to talk with me
Create a babe to talk with me
Babe don\'t go away,listen to me
Babe don\'t go away,listen to me
Babe don\'t go away,listen to me
只使用delete的时候只出现一个 Babe don\'t go away,listen to me,而使用delete[]的时候出现3个 Babe don\'t go away,listen to me。不过不管使用delete还是delete[]那三个对象的在内存中都被删除,既存储位置都标记为可写,但是使用delete的时候只调用了pbabe[0]的析构函数,而使用了delete[]则调用了3个Babe对象的析构函数。三、使用注意事项
1. 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可以动态开辟和撤销地址空间。在编程序时,若用完一个变量(一般是暂时存储的数据),下次需要再用,但却又想省去重新初始化的功夫,可以在每次开始使用时开辟一个空间,在用完后撤销它。
- 浅谈C++中new以及delete使用
- C++中new/delete以及new[]/delete[]的使用
- C++中delete, new以及new [], delete[]操作符内幕
- C++中delete, new以及new [], delete[]操作符内幕
- C++中delete, new以及new [], delete[]操作符内幕
- C++中delete, new以及new [], delete[]操作符内幕
- C++中delete, new以及new [], delete[]操作符内幕
- C++中delete, new以及new [], delete[]操作符内幕
- C++中delete, new以及new [], delete[]操作符内幕
- C++中delete, new以及new [], delete[]操作符内幕
- C++中delete, new以及new [], delete[]操作符内幕
- C++中delete, new以及new [], delete[]操作符内幕
- C++中new和delete的使用.c
- C++new与delete以及空指针
- 浅谈new和delete
- 浅谈new与delete
- 浅谈new、delete
- 【C++】new delete & new[] delete[]
- 解释术语:虚拟内存、缺页中断、抖动
- 对JSON Model format 3编码理解
- win7主机通过ssh链接linux虚拟机教程
- Android Studio问题收集
- PAT 1004. Counting Leaves (30)
- 浅谈C++中new以及delete使用
- java8卸载之后,别的版本不识别
- php中数据库链接版本过新,mysql_connect将被弃用
- linux下配置使用git和github
- 例题11-4 电话圈 UVa247
- POJ3070 Fibonacci(矩阵快速幂)
- Windows系统安装Apache Http Server
- 一年成为Emacs高手(像神一样使用编辑器)
- 关于谓词查询的深入分析(select …where (not) exists (…))