我的结构体是这样定义的:
struct CHARACTER
{
int ConCount;
RECT Rect;
WCHAR* Value;
};struct LINE
{
RECT Rect;
int CharacterCount;
CHARACTER* Characters;
};struct BLOCK
{
RECT Rect;
int LineCount;
LINE* Lines;
};struct RESULT
{
int BlockCount;
BLOCK* Blocks;
};我的释放函数是这样写的:
int CRecognize::CFreeMainRecognize( RESULT &v_out_characters )
{
int  i, j, k; for( i=0; i<v_out_characters.BlockCount; i++ )
{
for( j=0; j<v_out_characters.Blocks[i].LineCount; j++ )
{
for( k=0; k<v_out_characters.Blocks[i].Lines[j].CharacterCount; k++ )
{
free( v_out_characters.Blocks[i].Lines[j].Characters[k].Value );
}
free( v_out_characters.Blocks[i].Lines[j].Characters );
}
free( v_out_characters.Blocks[i].Lines );
}
free( v_out_characters.Blocks );
return res_OK;
}结果一运行到这个函数就报错了,注释掉第一个最中间那个free就没问题,可是那样就有内存释放不掉了。
我跟踪一下,v_out_characters都有值的。
这是什么原因,我应该怎么释放这个结构体的内存?

解决方案 »

  1.   

    你是怎么申请内存?用malloc还是new?
      

  2.   

    方法之一 :添加构造函数和析构函数,在析构函数里释放内存,如果是在结构之外new内存,要保证只释放一次:除在析构函数里释放外,别的地方不要释放;如果使用结构对象过程中有赋值操作,注意要写赋值操作和拷贝构造函数。 
      

  3.   


    哦,我以前没写过结构体的析构函数,我这个程序是个dll,
    里面有两个函数
    MainRecognize( RESULT &v_out_characters ) 
    和FreeMainRecognize( RESULT &v_out_characters ) 是成对使用的,
    其中FreeMainRecognize( RESULT &v_out_characters ) 就是调用我上面说的那个类函数,
    我如果要是像你说的,写成结构体的析构函数那样的话,我想问一下那个析构函数什么时候调用啊?
      

  4.   


    什么意思呢?我跟踪到v_out_characters的下面都有值和地址啊。
      

  5.   

    在每个free这前,先加判断是否为空
    例如
    if(v_out_characters.Blocks[i].Lines[j].Characters[k].Value!=NULL)
    free( v_out_characters.Blocks[i].Lines[j].Characters[k].Value );
      

  6.   

    在每个free这前,先加判断是否为空,内存释放后,把指针都值为空..这样写比较安全..不易出错..
      

  7.   

    用下面的代码测试下分配的内存,应该是存在空指针,或者无效指针
    int CRecognize::CFreeMainRecognize( RESULT &v_out_characters ) 

      int i, j, k;   for( i=0; i <v_out_characters.BlockCount; i++ ) { 
        for( j=0; j <v_out_characters.Blocks[i].LineCount; j++ ) { 
          for( k=0; k <v_out_characters.Blocks[i].Lines[j].CharacterCount; k++ ) { 
            ASSERT(v_out_characters.Blocks[i].Lines[j].Characters[k].Value)
            TRACE0(CString(v_out_characters.Blocks[i].Lines[j].Characters[k].Value));
          }
        } 
      } 
      return res_OK; 
    }
      

  8.   

    用下面的代码测试下分配的内存,应该是存在空指针,或者无效指针  
    int   CRecognize::CFreeMainRecognize(   RESULT   &v_out_characters   )   
    {   
        int   i,   j,   k;       for(   i=0;   i   <v_out_characters.BlockCount;   i++   )   {   
            for(   j=0;   j   <v_out_characters.Blocks[i].LineCount;   j++   )   {   
                for(   k=0;   k   <v_out_characters.Blocks[i].Lines[j].CharacterCount;   k++   )   {   
                    ASSERT(v_out_characters.Blocks[i].Lines[j].Characters[k].Value) 
                    TRACE0(CString(v_out_characters.Blocks[i].Lines[j].Characters[k].Value)); 
                } 
            }   
        }   
        return   res_OK;