C++有关delete p与delete []p的问题

请问大家一个问题:在C++中,删除一个用new分配的数组用以下格式:inta[]=newint[8];delete[]a;请问编译器是怎么知道数组a的大小的?另外,如下的... 请问大家一个问题:在C++中,删除一个用new分配的数组用以下格式:
int a[]=new int [8];
delete []a;
请问编译器是怎么知道数组a的大小的?

另外,如下的用法可以不,
int a[8];
int *p=a;
delete p;
这里"delete p"的用法有没有问题?改成"delete []p"呢?
展开
 我来答
iceser
推荐于2018-05-07 · TA获得超过2708个赞
知道大有可为答主
回答量:695
采纳率:100%
帮助的人:455万
展开全部
对于楼主定义的int[] 来说,
delete和delete[] 效果完全一样。

就释放内存来说,编译器是根据你这个指针的地址来知道这块内存的大小的,因为你申请的时候,内存管理器记录了这个地址开始的申请的内存的大小。

delete和delete[]的差别,在数组元素是一个对象的时候,就可以体现出来。
delete一般情况下,只会永远开始地址那个对象的析构函数,而delete[]可以调用数组中所有对象的析构函数。

对于简单的数据类型而言,delete和delete[]都只是释放内存,没有什么区别。
fcgzfcgz
2010-09-03 · TA获得超过239个赞
知道答主
回答量:59
采纳率:0%
帮助的人:63.9万
展开全部
编译器通过单个int类型数据占用的内存空间,自然可以算出8个int数据需要的空间,从而分配一块连续的内存空间使用,至于更加详细具体的内容,楼主其实不需要关心,如果要学得很深入,可以看看编译原理

至于后面的用法,int *p=a;是可以的,定义一个指针指向一个数组,由数组和指针的关系,相当于给数组a取了一个名子为p的别名

但是delete p;就有问题了,delete作用是将开辟的内存空间释放,而指针本身没有开辟内存空间,所以是不合法的,而且编译器在编译时不会检查,只有运行才会报错

delete p[] 有同样问题,不能通过别名来释放内存,因为编译器不知道本名的内存是否还要使用

但是楼主最开始的:
int a[]=new int [8];
delete []a;
这些定义删除没有问题,那个不存在别名问题,就是释放数组a的占有的内存空间
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
帐号已注销
2010-09-03
知道答主
回答量:28
采纳率:0%
帮助的人:18.7万
展开全部
delete p与delete []p:

delete p释放p所指的内存,如果p是类对象,还会调用p的析构函数;

delete []p释放p所指数组的内存,如果p是类对象,分别调用每个数组元素p[i]的析构函数;编译器通过“遍历”数组每个元素而进行删除,它并不是事先知道了大小,而是进行遍历搜索。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友427822458
2010-09-02 · TA获得超过105个赞
知道答主
回答量:172
采纳率:100%
帮助的人:80.2万
展开全部
int a[8];
int *p=a; //这个是可以的。把a的首地址赋给指针p;

delete p 不可以。一般delete和new 配套。p=a只是让p的首地址指向a,并没有开辟空间,所以不能delete。

至于编译器是怎么知道a数据大小,可以看看effective c++。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
vs...8@163.com
推荐于2016-10-30 · TA获得超过128个赞
知道答主
回答量:68
采纳率:0%
帮助的人:98万
展开全部
在C++中,删除一个用new分配的数组用以下格 在数组元素是一个对象的时候,就可以体现出来
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式