初步怀疑是在解析json后 释放内存出问题。请大家帮忙看看?必重谢。释放函数如下:
struct json_struct
{
string tableName;
map<int,string>* name;
vector<vector<string>*>* value;
};
int delete_jsonvector(vector<json_struct*> *vc_json)
{
if(NULL != vc_json)
{
CString ToLog;
size_t SIZE = 0;
vector<json_struct*>::iterator iter = vc_json->begin();
for(; iter != vc_json->end();)
{
for(vector<vector<string>*>::iterator iter2 = (*iter)->value->begin(); iter2 != (*iter)->value->end(); )
{
vector<string>* temp = *iter2;
if(temp != NULL)
{
SIZE = SIZE + _msize(temp); 
temp->clear();
delete temp;
temp = NULL;
}
iter2 = (*iter)->value->erase(iter2);
}

if((*iter)->value != NULL)
{;
SIZE = SIZE + _msize((*iter)->value); 
(*iter)->value->clear();
delete (*iter)->value;
(*iter)->value = NULL;
} if((*iter)->name != NULL)
{
SIZE = SIZE + _msize((*iter)->name); 
(*iter)->name->clear();
delete  (*iter)->name;
 (*iter)->name = NULL;
} json_struct * temp = (*iter);
iter = vc_json->erase(iter);
if(temp != NULL)
{
SIZE = SIZE + _msize(temp); 
delete temp;
temp = NULL;
}
} if(vc_json != NULL)
{
SIZE = SIZE + _msize(vc_json); 
delete vc_json;
vc_json = NULL;
}
ToLog.Format("delete %d size", SIZE); WriteLogInfo(ToLog);
}
return 1;
}

解决方案 »

  1.   

    有许多报内存泄露是虚报,将代码使用静态库编译连接看看是否也会泄露?
    或者将使用的附加DLL在连接器设置中,使用延迟加载试试。
      

  2.   

    如果是自己写的代码,网上有检测内存泄露的方法。用宏定义 malloc、free 等内存分配函数、重写new delete 方法。目的是让代码中有内存分配和释放的地方通过你定义重写的函数来实现,这样可以在调用分配内存的时候记录内存分配的代码位置、内存分配大小,并保存这些信息。当释放内存时,删除这些信息。程序结束时,看有哪些信息还未被删除,也就是有多少内存泄露了。因为内存分配是记录了信息,所以最后就可以查看是哪些地方分配了没有释放的。
      

  3.   

    大家看下 这样写能真正释放出vc_json的空间?
    int delete_jsonvector(vector<json_struct*> *vc_json)
    {
    if(NULL != vc_json)
    {
    //CString ToLog;
    //size_t SIZE = 0;
    vector<json_struct*>::iterator iter = vc_json->begin();
    for(; iter != vc_json->end();iter ++ )
    {
    for(vector<vector<string>*>::iterator iter2 = (*iter)->value->begin(); iter2 != (*iter)->value->end();iter2 ++ )
    {
    if(*iter2 != NULL)
    {
    delete *iter2;
    *iter2 = NULL;
    }
    }
    (*iter)->value->clear();

    if((*iter)->value != NULL)
    {
    delete (*iter)->value;
    (*iter)->value = NULL;
    } if(*iter != NULL)
    {
    delete *iter;
    *iter = NULL;
    }
    }
    vc_json->clear();
    if(vc_json != NULL)
    {
    delete vc_json;
    vc_json = NULL;
    }
    }
    return 1;
    }