大家都知道,要删除一个数组,指针名前只用一对方括号符,并且不管所删除数组的维数,忽略方括号内的任何数字。  
  如:  
  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;应该释放不干净吧?
因为我下面出现堆栈溢出的问题,觉得可能是哪里空间没释放彻底,谢谢大家:)

解决方案 »

  1.   

    如果你结构体里面的指针也是用new分配的空间的话,你必须先循环delete这些指针,然后再delete []数组。delete是不会嵌套的,因为它不知道你结构体内部的指针是否是new创建而来的。
      

  2.   

    感觉你想使用链表,链表定义没问题,但使用方式不太对delete[]  allneiSeg;仅仅是删除了“new neiSegs[10]”申请的空间。
    但是tagneiSegs ::relanote指针指向的内存空间不会被删除的(如果你申请了控件的话)。建议使用list或CList
      

  3.   

    我也觉得我应该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*
    应该怎么改呢?
    我没有使用链表,只是定义了我需要的与链表结构类似的这种结构...谢谢大家
      

  4.   

    简单办法: 给你的结构体tagneiSegs加一个析构函数吧,你在delete tagneiSegs的时候,让它的析构函数来自动释放relanote的内存
      

  5.   

    你在结构中用的是relaNote指针,而你在delete时,写成delete allneiSeg[i].relanote[j],这里relaNote[j]是relaNote的实例了啊,你的relanote指针其实是relanote对象的数组啊。数组的成员是relaNote实例啊,怎么能用delete呢???
      

  6.   

    本帖最后由 happyparrot 于 2009-08-03 16:43:24 编辑
      

  7.   

    for (int i=0;i <subSegNum;i++)
    { delete [] allneiSeg[i].relanote;

    }
    delete [] allneiSeg; 
    根据楼上启发,我现在改成这个样子了,编译通过了,应该能释放干净了吧?但是还是有内存泄露问题,我怀疑是不是其它地方...谢谢大家,结贴就有分:)
      

  8.   

    你在调试状态下运行系统后再退出系统。在output中查看内存泄露报告。
      

  9.   

    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;所有内存都可以释放!
      

  10.   

    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; 所有内存都可以释放!