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;应该释放不干净吧?
因为我下面出现堆栈溢出的问题,觉得可能是哪里空间没释放彻底,谢谢大家:)
...全文
464 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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创建而来的。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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