导航
  • 主页
  • VC/MVC基础类
  • .NET 技术
  • VC/MFC界面
  • VC/MFC 进程
  • VC/MFC 数据库
  • VC/MFC&Web
  • Doc/View
  • VC++技术资源

delete 结构体类型数组

meganzzy 2009-08-03 04:05:44
大家都知道,要删除一个数组,指针名前只用一对方括号符,并且不管所删除数组的维数,忽略方括号内的任何数字。
如:
int *p;
p = new int[10];
delete[] p;
如果要删除一个结构体指针
typedef struct tagrelaNote
{//邻域关系节点类型
int id;/
int edgeLength;
}relaNote,*lprelaNote;
ralaNote seg=new ralaNote;
直接delete seg;seg=null;就可以了;
但是如果我要删除一个包含结构体指针数组该怎么办呢?下面是我定义的结构体和结构体指针
typedef struct tagrelaNote
{//邻域关系节点类型
int id;
int edgeLength;
}relaNote,*lprelaNote;

typedef struct tagneiSegs
{//所含邻域类型
int neiNum;//所含邻域个数
int segId;
int merFlag;
relaNote* relanote;//包含的邻域关系节点
}neiSegs, *lpneiSegs;
neiSegs* allneiSeg = new neiSegs[10];
下面我为数组中每个成员的ralaNote都分别开辟空间并分别赋值用于计算;请各位高手帮忙,我用完了这个数组allneiSeg,我该怎么释放它?
delete[] allneiSeg;应该释放不干净吧?
因为我下面出现堆栈溢出的问题,觉得可能是哪里空间没释放彻底,谢谢大家:)
...全文
225 1 收藏 11
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
meganzzy 2009-08-03
[Quote=引用 10 楼 andyxia 的回复:]
typedef struct tagrelaNote
{//邻域关系节点类型
      int id;
      int edgeLength;
}relaNote,*lprelaNote;

typedef struct tagneiSegs
{//所含邻域类型
int neiNum;//所含邻域个数
int segId;
int merFlag;
relaNote* relanote;//包含的邻域关系节点

tagneiSegs()
{
  relanote = NULL;  //刚才这里写错了。
}
~tagneiSegs()
{
  if(relanote != NULL)
    {
      delete relanote;
      relanote = NULL;
    }
}
}neiSegs, *lpneiSegs;

neiSegs* allneiSeg = new neiSegs[10];

...

delete[] allneiSeg;

所有内存都可以释放!
[/Quote]
好的,谢谢,我先试试,有问题再来:)
回复
AndyXia 2009-08-03
typedef struct tagrelaNote
{//邻域关系节点类型
int id;
int edgeLength;
}relaNote,*lprelaNote;

typedef struct tagneiSegs
{//所含邻域类型
int neiNum;//所含邻域个数
int segId;
int merFlag;
relaNote* relanote;//包含的邻域关系节点

tagneiSegs()
{
relanote = NULL; //刚才这里写错了。
}
~tagneiSegs()
{
if(relanote != NULL)
{
delete relanote;
relanote = NULL;
}
}
}neiSegs, *lpneiSegs;

neiSegs* allneiSeg = new neiSegs[10];

...

delete[] allneiSeg;

所有内存都可以释放!
回复
AndyXia 2009-08-03
typedef struct tagrelaNote
{//邻域关系节点类型
int id;
int edgeLength;
}relaNote,*lprelaNote;

typedef struct tagneiSegs
{//所含邻域类型
int neiNum;//所含邻域个数
int segId;
int merFlag;
relaNote* relanote;//包含的邻域关系节点

tagneiSegs()
{
tagneiSegs = NULL;
}
~tagneiSegs()
{
if(relanote != NULL)
{
delete relanote;
relanote = NULL;
}
}
}neiSegs, *lpneiSegs;

neiSegs* allneiSeg = new neiSegs[10];

...

delete[] allneiSeg;

所有内存都可以释放!


回复
快乐鹦鹉 2009-08-03
你在调试状态下运行系统后再退出系统。在output中查看内存泄露报告。
回复
meganzzy 2009-08-03
for (int i=0;i <subSegNum;i++)
{

delete [] allneiSeg[i].relanote;

}
delete [] allneiSeg;
根据楼上启发,我现在改成这个样子了,编译通过了,应该能释放干净了吧?但是还是有内存泄露问题,我怀疑是不是其它地方...谢谢大家,结贴就有分:)
回复
快乐鹦鹉 2009-08-03
for (int i=0;i <subSegNum;i++)
{

delete allneiSeg[i].relanote;
}
delete []allneiSeg;
这样子
回复
快乐鹦鹉 2009-08-03
你在结构中用的是relaNote指针,而你在delete时,写成delete allneiSeg[i].relanote[j],这里relaNote[j]是relaNote的实例了啊,你的relanote指针其实是relanote对象的数组啊。数组的成员是relaNote实例啊,怎么能用delete呢???
回复
AndyXia 2009-08-03
简单办法: 给你的结构体tagneiSegs加一个析构函数吧,你在delete tagneiSegs的时候,让它的析构函数来自动释放relanote的内存
回复
meganzzy 2009-08-03
我也觉得我应该delete结构体内部的指针
for (int i=0;i<subSegNum;i++)
{
for (int j=0;j<allneiSeg[i].neiNum;j++)
{
delete allneiSeg[i].relanote[j];
}
delete allneiSeg[i];
}
可是我这么做编译说delete无法从ralaNote转化为void*。。。
应该怎么改呢?
我没有使用链表,只是定义了我需要的与链表结构类似的这种结构...谢谢大家
回复
雪影 2009-08-03
感觉你想使用链表,链表定义没问题,但使用方式不太对

delete[] allneiSeg;仅仅是删除了“new neiSegs[10]”申请的空间。
但是tagneiSegs ::relanote指针指向的内存空间不会被删除的(如果你申请了控件的话)。

建议使用list或CList
回复
快乐鹦鹉 2009-08-03
如果你结构体里面的指针也是用new分配的空间的话,你必须先循环delete这些指针,然后再delete []数组。delete是不会嵌套的,因为它不知道你结构体内部的指针是否是new创建而来的。
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告