永发信息网

int a[10]和int *a=new int [10]的区别??什么时候用前一个?什么时候用后一个?请教各位大侠,谢谢!!

答案:4  悬赏:80  手机版
解决时间 2021-04-06 16:58
int a[10]和int *a=new int [10]的区别??什么时候用前一个?什么时候用后一个?请教各位大侠,谢谢!!
最佳答案
1.如果只是int a[10]和int* a=new int[10]比较的话,那究竟使用哪个其实无所谓,前者可能还更简单一点。只是在使用上int* a=new int[10]需要判断内存是否分配成功,以及在不用时需要使用delete[] a进行内存释放;

2.如果不是a[10],而是a[1000000000]或者更大的话,那一般情况下,就只能使用int* a=new这种方式了。这个涉及到内存存放位置的问题,int a[]这种方式,内存是存放在栈上;int* a=new这种方式,内存是存放在堆上,栈的实际内存是连续内存,因此可分配空间较小,堆可以是非连续内存,因此可以分配较大内存。因此,如果需要分配较大内存,需要分配在堆上;

3.使用int a[10]这种方式,内存大小需要用常量指定,比如这里的10。不能用int m=10;int a[m]这种方式。但是int* a= new这种方式可以,因此在动态分配内存上,后者有非常大的优势
全部回答
第二个的效率好一点,不过要记得要用delete释放
式。
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,尽量避免内存泄露。
int a[10]是在全局空间或栈空间上分配整型数组,全局空间的数组无法释放,栈空间的数组随着函数返回自动释放。
int *a=new int[10]是在堆空间上分配整型数组,这个数组可以用delete[]释放掉。
一般来说前者用在确切知道数组大小时使用,后者用于运行时才知道大小时使用,即动态分配内存。还有,有的时候数组可能太大,而栈空间有限,此时也应采用动态分配。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
监控设备一套都包括什么东西??每个部件大概
单选题烟台某中学的研究性小组为了考察长岛县
大写数字怎么写,中国数字从1到9最正规的写法?
分手了5天,提和好,他说考虑考虑,我还有机
祝各位新年快乐
特岗与三支一扶有什么区别?
村长带着人把人给打了村长是否有责任
川娃私房菜在什么地方啊,我要过去处理事情
根据句意和汉语注释,在答卷标有题号的横线上
大千世界本地人要不要门票
一年级我的荣誉怎么写,一年级我多想去怎么怎
把几个Cad图纸 合并到一个Cad文件。但是不同
淘宝网店装修的编码应该怎么做?
word最后一行跟页码距离怎么统一
vivoX21世界杯定制版典藏蓝和胜利红色哪个
推荐资讯
哪里有卖喂宠物喝水的针管
k208次列车经过路线
2012年5月,广州南沙千吨甘蔗滞销,种植户“
我想问缩宫素这个针有什么作用
关于科学家发明的故事
死神vs火影2.5鬼步怎么搞
什么是矢量
CPU位数是什么?
王者荣耀垃圾游戏人家玩了也可以投诉希望快到
lol鸟姐的q可以用远见改造吗
《去大理》里的一句歌词:“谁的头上没有灰尘
针对和争对
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?