请大家帮忙看下这2个函数,每次泄露都是15980字节,怎么回事?
// allocate memory blocks
void* s2dmalloc( u32 size )
{
void* mem= OSMalloc( size );
if( mem == NULL ){
mem = malloc(size);
s32 i;
for( i=0;i<MAX_MEMBUF;i++){
if( g_pMembuffer[i] == NULL ){
g_pMembuffer[i] = mem;
return mem;
}
}
if( i == MAX_MEMBUF ){
if (mem==NULL)
{
return NULL;
}
else
{
free( mem);
    return NULL;
}
}
}
return mem;
}
// frees a memory block
void s2dfree( void* mem )
{
for( s32 i=0;i<MAX_MEMBUF;i++){
if( g_pMembuffer[i] == mem ){
if (mem==NULL)
{
return;
}
else
{
free( mem );
}
g_pMembuffer[i] = NULL;
return;
}
}
OSFree( mem );
}

解决方案 »

  1.   


    void* s2dmalloc( u32 size )
    {
    void* mem= OSMalloc( size );
    if( mem == NULL ){
    mem = malloc(size);
    s32 i;
    for( i=0;i<MAX_MEMBUF;i++){
    if( g_pMembuffer[i] == NULL ){
    g_pMembuffer[i] = mem;
    return mem; 
    }
    }
    if( i == MAX_MEMBUF ){
    if (mem==NULL)
    {
    return NULL;
    }
    else
    {
    free( mem);
    return NULL;
    }
    }
    }
    return mem; // 这里吧,释放了怎么还返回mem呢?
    }
      

  2.   

    s2dmalloc这个函数返回的void* mem 
    一定要作为参数调用s2dfree这个来释放,
      

  3.   


    void* s2dmalloc( u32 size )
    {
    void* mem= OSMalloc( size );
    if( mem == NULL ){
    mem = malloc(size);
     if (mem!= NULL) {
                s32 i;
                for( i=0;i<MAX_MEMBUF;i++){
                    if( g_pMembuffer[i] == NULL ){
                        g_pMembuffer[i] = mem;
                        break;  
                    }
                }
                if( i == MAX_MEMBUF )
    {
                    free(mem);
                }
            }
        }
       // return mem;  
    }
    // frees a memory block
    void s2dfree( void* mem )
    {
    for( s32 i=0;i<MAX_MEMBUF;i++){
    if( g_pMembuffer[i] == mem ){
    free( mem );
    mem=NULL;
    //return NULL;
    g_pMembuffer[i] = NULL;
    return;
    }
    }
    OSFree( mem );
    }
    你的意思是这样?
      

  4.   

    你的代码能好好标记一下么
    像这样
    void s2dfree( void* mem )
    {
      for( s32 i=0;i<MAX_MEMBUF;i++)
      {
        if( g_pMembuffer[i] == mem )
        {
           free( mem );
           mem=NULL;
           //return NULL;
           g_pMembuffer[i] = NULL;
           return;
        }
      }
      OSFree( mem );
    }
    而且这个东西不是看出来的
    我们也就是提一下思路
    你试一下不就知道了
      

  5.   

    谢谢大家 ,我大致了解了,有可能是 OSMalloc 问题 也可能是没有手动调用 s2dfree