请问 这两种delete 形式一样吗?

xiangongda 2008-12-27 06:43:39
请问 这两种delete 形式一样吗?
int *p=new int[10];
delete []p;
delete (int(*)[10])p;
...全文
114 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
redstorm_fyy 2008-12-28
  • 打赏
  • 举报
回复
删除数组用 delete[]
xiangongda 2008-12-28
  • 打赏
  • 举报
回复
谢谢各位 高手真不少!!
潇离 2008-12-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 li_il 的回复:]
第二条,相当于
delete reinterpret_cast <int(*)[10]>(p);
最好不要这样转换指针。
[/Quote]
nineforever 2008-12-27
  • 打赏
  • 举报
回复
只要你new的是数组,就必须用delete []。
你的代码在VC里可以正常运行是因为VC会自动帮你把第二个delete改成delete []。
参见http://msdn.microsoft.com/en-us/library/h0d7122c.aspx
xiaoyisnail 2008-12-27
  • 打赏
  • 举报
回复
效果一样,但没必要搞那么复杂,用第一种方式,让编译器帮我们干活吧
waizqfor 2008-12-27
  • 打赏
  • 举报
回复
delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。在More Effective C++中有更为详细的解释:“当delete操作符用于数组时,它为每个数组元素调用析构函数,然后调用operatordelete来释放内存。”delete与New配套,delete []与new []配套
MemTest*mTest1=newMemTest[10];
MemTest*mTest2=newMemTest;
int*pInt1=newint[10];
int*pInt2=newint;
delete[]pInt1; //-1-
delete[]pInt2; //-2-
delete[]mTest1;//-3-
delete[]mTest2;//-4-
在-4-处报错。
这就说明:对于内建简单数据类型,delete和delete[]功能是相同的。对于自定义的复杂数据类型,delete和delete[]不能互用。delete[]删除一个数组,delete删除一个指针简单来说,用new分配的内存用delete删除用new[]分配的内存用delete[]删除delete[]会调用数组元素的析构函数。内部数据类型没有析构函数,所以问题不大。如果你在用delete时没用括号,delete就会认为指向的是单个对象,否则,它就会认为指向的是一个数组
li_il 2008-12-27
  • 打赏
  • 举报
回复
第二条,相当于
delete reinterpret_cast<int(*)[10]>(p);
最好不要这样转换指针。


ypb362148418 2008-12-27
  • 打赏
  • 举报
回复
new出来的数组只能用Delete[]来删除,你写的第二种我没见过。
机智的呆呆 2008-12-27
  • 打赏
  • 举报
回复

int *p=new int[10];
delete []p;//回收10个int内存空间
delete (int(*)[10])p; //回收一个指向含有10int的数组的指针,实际也是10个int
从最终的执行结果上来看这两种形式是一致的,但推荐第一种~~~~用法

#include <iostream>
using namespace std;
int main()
{
int *p=new int[25*1024*1024];
system("pause");
delete []p;
system("pause");
p=new int[25*1024*1024];
system("pause");
delete (int(*)[25*1024*1024])p;
system("pause");
}


在vs2005 和devc++上试了一下,基本都没问题
lc19890326 2008-12-27
  • 打赏
  • 举报
回复
凡是new出来的数组只能使用delete []删除
你第二个形式貌似是把p做了一个转型,使其成为指向一个指针数组 没有这么用的 我没见过
你看看下面这个程序的编译器警告信息就知道了

#include <iostream>
using namespace std;
int main()
{
int* p1=new int[10];
int* p2=new int[10];
delete [] p1;
delete (int(*)[10])p2;
return 0;
}
yueyucanyang 2008-12-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 xiangongda 的帖子:]
请问 这两种delete 形式一样吗?
int *p=new int[10];
delete []p;
delete (int(*)[10])p;
[/Quote]

哦,没见过第二种,用第一种就可以了!~

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧