我的结构体是这样定义的:
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都有值的。
这是什么原因,我应该怎么释放这个结构体的内存?
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都有值的。
这是什么原因,我应该怎么释放这个结构体的内存?
解决方案 »
- socket编程时,服务端突然断电后客户端为什么不能监测到网络已断开?
- 请问ATL调用javascript函数
- MFC读取Excel文件的问题
- 在VC中使用水晶报表9.2出现的问题
- 一个浮点数,如何赋给一个字节?
- DataGrid控件和FlexGrid控件问题?
- 关于MSN的界面的疑问?
- 十万火急,求救:OpenGL代码的解释(分不够加)
- ★★高手帮我解释一下下面ODBC连接ACCESS的语句★★谢谢
- std的queue在我使用了pop后那个内存是否已经被释放?
- VC用ADO连接SQLServer2005连接不上
- emule src的kademlia协议实现Search的NODECOMPLETE有啥用?
哦,我以前没写过结构体的析构函数,我这个程序是个dll,
里面有两个函数
MainRecognize( RESULT &v_out_characters )
和FreeMainRecognize( RESULT &v_out_characters ) 是成对使用的,
其中FreeMainRecognize( RESULT &v_out_characters ) 就是调用我上面说的那个类函数,
我如果要是像你说的,写成结构体的析构函数那样的话,我想问一下那个析构函数什么时候调用啊?
什么意思呢?我跟踪到v_out_characters的下面都有值和地址啊。
例如
if(v_out_characters.Blocks[i].Lines[j].Characters[k].Value!=NULL)
free( v_out_characters.Blocks[i].Lines[j].Characters[k].Value );
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;
}
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;
}