请详细解释一下c++中的new和delete
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请详细解释一下c++中的new和delete相关的知识,希望对你有一定的参考价值。
刚刚学到这张,晕的不行。。
new和delete什么情况下用?为什么要用??最好能给几个易懂的例子
另外也请你解释一下静态和动态指针。
请不要复制,谢谢!!
一、new 和 delete
首先,你需要知道程序在内存中。它分为四部分:
code:代码
data: 数据(全局、静态变量)
stack:栈(局部变量)
heap:堆(你负责的地方,比如用来动态内存分配,即new和delete)
程序运行时所需要的数据空间,通常是在程序设计时通过定义变量或数组的方式,由系统预先分配。比如定义一个对象,在程序运行过程,它的空间不能随时释放。
【产生背景】:①在程序设计时,有些数据空间的大小和多少在编写程序时 还不能确定,只有在程序运行时才能确定。 ②有时希望在需要对象时才建立,不需要就立刻撤销它,释放其内存供别的数据使用。
【解决】:使用堆(heap)内存可以实现这一功能。堆是一种内存空间,它允许程序运行时 根据需要申请大小的内存空间。堆又称动态内存分配。
【使用方法】:
new运算符:
1、使用格式:指针=new 数据类型名;
指针=new 数据类型名(初始值);
作用: 从内存的动态区域申请指定数据类型所需的存
储单元。若分配成功,该存储单元的首地址赋
给指针,否则,指针得到一个空地址。
例如:
(1) double *p;�
p=new double;
(2) double *p;�
p=new double(12.3576); //分配同时初始化
2、指针=new 数据类型〔元素个数〕�
用new在堆中申请一块连续的存储空间(一维数组)
例:
int size, *ip;
cin>>size;
ip=new int[size]; //创建size个元素的整型数组
char *sp=new char[20]; //创建20个字符的字符数组
delete运算符:
使用格式:
delete 指针名; //释放指针所指内存单元
delete 〔 〕指针名; //释放数组内存单元�
作用:释放用new创建的动态存储单元 。
例如:
int *pi=new int(5);�//创建
delete pi;� //释放
pi=new int;� //再创建
【注意】:
delete运算符并不删除指针。
对于指向动态分配内存单元的指针,在其所指向的内存单元没有释放前, 该指针不能重新赋值。
每个new运算符创建的内存单元,只能用delete释放一次。而且一个new对应一个delete是最好的。
new和delete例子很不经意。实际用时发现问题再解决吧。
二、静态指针 动态指针
好像没有专门的定义“静态指针”和“动态指针”吧!
C++中各种数据类型都可以指定指针变量。指针除了可以指向一般变量外,还可以指向其他任何数据结构。一般的指针的用法及计算你肯定知道。
【动态方面:
在用new动态建立(上面)一个对象时,会返回一个指向新对象的指针值,即分配的内存空间首地址。通过这个指针调用对象很方便。
【静态方面:
const :使数据在一定范围共享,又保证它不被随意修改。即定义为常量。
① int * const p = a; //常指针
const修饰指针,p的指向不可变。在定义 的时候指向谁,就不能再变。
②const int * p = a; //指向常对象的指针
const 修饰类型int, p指向的数据内容不可变,即不能通过指针p改变a的值(但可以通过其他途径)
ps:const型变量只能由 这种指针指向它。
指针太灵活,使用时小心为好,比如指针与数组,p++和*p++的区别等等。
End。 参考技术A 你想弄懂这个问题,首先你要弄清楚数据的3种存储方式。
1。静态区: 全局变量。
2。堆: 程序执行是分配的内存
3。栈: 函数调用,局部变量。
new出来的内存就是分配到堆上的。程序执行完以后,堆上分配的内存不会被操作系统自动回收,所以你不delete掉的话,操作系统不回收,那块内存就成了没爹没娘的无业有民了,这个就叫内存泄露。
我这样说你应该知道为什么书上为什么说new和delete要成对出现了吧。分配出来的内存记得自己回收掉。
静态区和栈上面分配的内存操作系统会自动回收。所以不用delete了。
另外,我觉得你好像没有搞清楚new出来了什么东西,delete掉了什么东西。我给你举例子说。
int * pt ;
pt = new int;
这句话的意思是你先声明了一个pt指针,四个字节,放在栈里面的,然后你new了一个int形的数据放在堆里面,再把这个数据的地址赋给pt。
delete pt;
这个就是把pt指向的地址所占的内存释放掉。其实释放的就是堆上面的那个int。然后你的pt还是存在的,还在栈里面。不过你查它的值时,变成了null
这样说懂了吧。
其实你程序里面的del是在别的地方new了。
就比如:
int * A()
int *pt = new int;
return pt;
main()
int * ptMain;
ptMain = A();
delete ptMain;
这样一个过程,就像你给出的例子了。
不过,我们编程的时候尽量 谁new的谁delete,尽量避免内存泄露。本回答被提问者和网友采纳 参考技术B 默认情况下(没有重载new运算符) new int 结果上完全等价于 (int *)malloc(sizeof(int))。new int[n]完全等价于(int *)malloc(sizeof(int) * n)
这个可以推广到所有非类类型。
对于类,假设ClassA,new ClassA; 相当于(ClassA *)malloc(sizeof(ClassA))之后用返回的指针调用ClassA的默认构造函数,再返回那个指针
new ClassA(参数表) 基本上和上面一样,只是会调用参数表对应的构造方法
new ClassA[n]比较复杂,一般会进行类似 int *t = (int *)malloc(sizeof(ClassA) * n + sizeof(int)); *t = n; ClassA *r = (ClassA *)(t + 1); for (int i = 0; i < n; i++, (r++)->ClassA::ClassA()); return (ClassA *)(t + 1);的操作。简单说就是申请内存,保存个数,然后对每个对象调用构造函数
对于非类类型 delete p和delete[] p相同,等价于free(p)
对于类,假设还是ClassA,delete p等价于 p->ClassA::~ClassA(); free(p); 先调用析构函数,然后释放内存
对于delete[] p,并且p用new []申请。对应上面的new []实现,delete[] p会进行 int *t = (int *)p - 1; for (int i = 0; i < *t; i++, (p++)->ClassA::~ClassA()); free(t);的操作。 参考技术C NULL是C语言发明的东西,在C里面null就是0,这样说很明白吧
在C++里面null仍然有效,但不再是0,0就是0,null就是null,通常很少使用null了,null表示当前指针没有指向任何位置,即允许不指向特定位置的指针存在且合法
我可以帮助你,你先设置我最佳答案后,我百度Hii教你。 参考技术D 这可不是一两句话能讲明白的!虽说这不是什么重点,但是个难点。如果可以的话,可以联系!
C++动态申请内存,new和delete详细介绍以及举例
以上是关于请详细解释一下c++中的new和delete的主要内容,如果未能解决你的问题,请参考以下文章
C++ 中的 new/delete 和 new[]/delete[]深入理解