new与delete[]的问题请教?

tsohg 2004-11-16 10:21:45
程序代码如下,关键是下面的两句:
pIInfo=(PIP_INTERFACE_INFO)new(char[ulSize]); ///00000000000000000
delete pIInfo; ///00000000000000000
请问如下面那样delete会不会造成内在泄漏?? 正确是不是应该delete []pIInfo或
delete [] (char*)pIInfo ?

/////////////////////////////////////////////////////////////////////////////////

DWORD ulNumOfInterfaces=0;
pGNOInterface=(PGNOINTERFACE)GetProcAddress(hInst,"GetNumberOfInterfaces");
pGNOInterface(&ulNumOfInterfaces);
cout<<"U have "<<ulNumOfInterfaces<<" network interfaces\n";
//获取网络接口信息
pGIInfo=(PGIINFO)GetProcAddress(hInst,"GetInterfaceInfo");
PIP_INTERFACE_INFO pIInfo=NULL;
ulSize=0;
pGIInfo(pIInfo,&ulSize);//第一次调用,获取缓冲区大小

pIInfo=(PIP_INTERFACE_INFO)new(char[ulSize]); ///00000000000000000

pGIInfo(pIInfo,&ulSize);
//显示网络接口信息
for(int i=0;i<pIInfo->NumAdapters;i++){
cout<<"Adapter index:"<<pIInfo->Adapter[i].Index<<endl;
cout<<"and name:"<<pIInfo->Adapter[i].Name<<endl;
}

delete pIInfo; ///00000000000000000

...全文
123 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodluckyxl 2004-11-16
  • 打赏
  • 举报
回复

pIInfo=(PIP_INTERFACE_INFO)new(char[ulSize]); ///00000000000000000
delete pIInfo; ///00000000000000000
请问如下面那样delete会不会造成内在泄漏?? 正确是不是应该delete []pIInfo或
delete [] (char*)pIInfo ?
////////////////
答: 不会 注意你new的东西 是一个对象 并调用自定义构造函数 仅仅构造了一个对象
只用delete pIInfo;是可以的
是否能delete [](char*)pIInfo;不是很清楚
///////////////
如果是循环申请( 循环内部new这个对象)
如果不在当前循环结束前释放 就需要记录每次 new的地址
统一释放,否则肯定会造成泄露

healer_kx 2004-11-16
  • 打赏
  • 举报
回复
哦? 是吗,我错了, 再给详细的说说吧。
xuzheng318 2004-11-16
  • 打赏
  • 举报
回复
楼上正解!
oo 2004-11-16
  • 打赏
  • 举报
回复
用delete pIInfo;是对的;

不会造成内存泄露;

如果pIInfo指向的object的类没有自定义的析构函数,
用delete [](char*)pIInfo;也是可以的;

mathe 2004-11-16
  • 打赏
  • 举报
回复
http://www.glenmccl.com/newdel.htm
寻开心 2004-11-16
  • 打赏
  • 举报
回复
new 和 delete 是应该匹配的
用的是new 就 调用 delete
用的是 new **[] 就调用 delete [] **;

对于类对象必须严格按照上面说的去做, 对普通的int, float, char等类型是没有必要的
delete和delete [] 的区别就在于, 后者在释放空间的同时, 为每个类对象都调用了它的析构函数
如果用delete处理一个new **[]的指针, 那么只有 **[0]的析构被调用, 后面的**[1], ...等对象的析构函数都不会被调用,很容易造成内存泄漏的

对于int和char等类型无所谓, 他们不需要析构函数也可以正常工作的

对于你的问题, 因为new的是char类型, 所以用不用delete[] 无所谓, 都不会出错
但是出于养成良好习惯的考虑, 建议用[]
healer_kx 2004-11-16
  • 打赏
  • 举报
回复
当然了new和delete是匹配的。
new[]和delete[]是匹配的!。

你new出来的字符数组哦。
carylin 2004-11-16
  • 打赏
  • 举报
回复
delete [] (char*)pIInfo 没有这种写法的。还是写成
delete [] pIInfo 吧
moany 2004-11-16
  • 打赏
  • 举报
回复
应该用delete []pIInfo,期待更准确的回答。

64,654

社区成员

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

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