c++中关于delete的疑问

alwaysrun 2006-08-08 12:53:57
假设有如下定义
typedef struct
{
int iLen;
char array[1];
}MY_STRUCT;
那么按如下方式申请内存空间
MY_STRUCT *pStruct = (MY_STRUCT*)new char[256+sizeof(int)];

请问在退出时,如何释放缓冲区?
我试验过:
delete pStruct;

delete[] pStruct;
两种方法,通过Boundschecker检测,都没有报内存泄漏。
请各位大虾指教,应该如何删除,多谢了!
...全文
211 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
genius_hb 2006-08-08
  • 打赏
  • 举报
回复
好的做法是:
char *p = pStruct;
delete []p;
因为你是这样申请的空间:
MY_STRUCT *pStruct = (MY_STRUCT*)new char[256+sizeof(int)];
delete和new是搭配使用的,既然new的是char 类型数组,那么delete就是char类型数组。
而上面几位说的都有道理,他们是告诉你,因为你是将char类型指针强制转换成了MY_STRUCT类型,那么在你对这个内存操作后,应该将MY_STRUCT中重新分配(如果有的话)的内存释放掉。
当然这里是因为new的是内置char类型,所以你可以直接delete pStruct。
但如果你这样(我想你不会的^_^):
MY_STRUCT *pStruct = (MY_STRUCT*)new SomeClassType[256+sizeof(int)];
那么,你释放的时候同样应该是:
SomeClassType *p = pStruct;
delete []p;
如果这样:
delete pStruct;或delete []pStruct;都难保他不出问题。
triace_zhang 2006-08-08
  • 打赏
  • 举报
回复
struct里面又没有指针成员引发的旁支内存,delete pStruct;与 delete[] pStruct;都可以。
OOPhaisky 2006-08-08
  • 打赏
  • 举报
回复
delete pStruct;

delete[] pStruct;
两种方法,通过Boundschecker检测,都没有报内存泄漏。
------------------------------------------------------
没错,都没有内存泄漏。因为此处没有涉及“内存分配与释放的C++特性”,即“用户自定义的delete”和“析构函数”,而是简简单单的释放内存,所以没有问题(楼主可以这样想:delete和delete[]最后会把要释放的指针传递给free函数,即free(p),所以会正确地释放内存空间,不会发生内存泄漏)。
如果涉及“内存分配与释放的C++特性”,则情况不同了。
delete pStruct;分为两步执行:
1.调用析构函数;
2.调用适当的operator delete(可能是用户自定义的,也可能是默认的全局operator delete);
而这两步中的任何一个出现问题,你的delete也不能算是“成功”执行。
pass86 2006-08-08
  • 打赏
  • 举报
回复
C++ Primer Plus 5上说应该是delete [] pStruct;
yanli160 2006-08-08
  • 打赏
  • 举报
回复
数组生成的内存空间要用delete[]
各元素生成的可用delete

为方便都用delete[]就可以了
格兰特杨 2006-08-08
  • 打赏
  • 举报
回复
(MY_STRUCT*)new char[256+sizeof(int)];

一事不明:你的256从何而来。你是不是想
typedef struct
{
int iLen;
char *array; //256是array的长度?
}MY_STRUCT;

那样的话,我的建议是
struct
{
int iLen;
char *array; //256是array的长度?
MY_STRUCT(int size)
{
array = new char[size];
}
~MY_STRUCT()
{
delete[] array; //你非要delete array也不会有问题
}
}MY_STRUCT;

MY_STRUCT *pStruct = new MY_STRUCT(256);
lkpo 2006-08-08
  • 打赏
  • 举报
回复
不要想了delete[]
格兰特杨 2006-08-08
  • 打赏
  • 举报
回复
看代码方便起见建议使用delete[].

:-)
格兰特杨 2006-08-08
  • 打赏
  • 举报
回复
在对于char这种基本类型的delete操作时,结果是一样的。
区别仅在于非基本类型且有析构函数的操作,delete[]可以保证调用每一个数组成员的析构。

64,281

社区成员

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

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