初步懷疑是在決議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;
}
uj5u.com熱心網友回復:
能否看到泄露的具體資訊?個人建議,
1 單獨把這一部分寫一段測驗程式,插入一些資料,再清理,看是否存在泄漏
2 把這部分插入和清理的屏蔽了再測驗看是否存在泄漏?
3 單步除錯 或插入日志,看運行流程和資料是否正確
4 考慮是否存在越界 或指標被修改的的情況
uj5u.com熱心網友回復:
有許多報記憶體泄露是虛報,將代碼使用靜態庫編譯連接看看是否也會泄露?或者將使用的附加DLL在連接器設定中,使用延遲加載試試。
uj5u.com熱心網友回復:
現在確實比較頭疼,記憶體眼看慢慢漲上去,專案比較大,如何定位是好?uj5u.com熱心網友回復:
如果是自己寫的代碼,網上有檢測記憶體泄露的方法。用宏定義 malloc、free 等記憶體分配函式、重寫new delete 方法。目的是讓代碼中有記憶體分配和釋放的地方通過你定義重寫的函式來實作,這樣可以在呼叫分配記憶體的時候記錄記憶體分配的代碼位置、記憶體分配大小,并保存這些資訊。當釋放記憶體時,洗掉這些資訊。程式結束時,看有哪些資訊還未被洗掉,也就是有多少記憶體泄露了。因為記憶體分配是記錄了資訊,所以最后就可以查看是哪些地方分配了沒有釋放的。uj5u.com熱心網友回復:
大家看下 這樣寫能真正釋放出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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/54347.html
標籤:基礎類
上一篇:請大家幫忙辨認一個工業相機
下一篇:動態繪圖引起的抖動問題
