void CMAC_SearchDlg::OnBnClickedUpdate()
{
// TODO: ここにコントロール通知ハンドラ コードを追加します。
CString sSQLline;
char *tmp1 = new char[64];
char *tmp2 = new char[64];
for (int i=0; i<m_ListCtrl.GetItemCount(); i++){
if(m_ListCtrl.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED){ sSQLline.Format(_T("insert into nodeinfo values('") + m_ListCtrl.GetItemText(i, 4) 
+ _T("','") + m_ListCtrl.GetItemText(i, 5) + _T("','") + m_ListCtrl.GetItemText(i, 6) + _T("');") ); int wszLEN = WideCharToMultiByte(CP_ACP, 0, sSQLline.GetBuffer(), -1, NULL, 0, NULL, NULL);
WideCharToMultiByte(CP_ACP, 0, sSQLline.GetBuffer(), -1, tmp1, wszLEN+1, NULL, NULL);
sqlite3_exec(m_pDB, tmp1, 0, 0, NULL); sSQLline.Format(_T("update nodeinfo set MAC_Add = '") + m_ListCtrl.GetItemText(i, 6) 
+ _T("' ,Host_Name = '") + m_ListCtrl.GetItemText(i, 4) + _T("' where IP_Add = '") 
+ m_ListCtrl.GetItemText(i, 5) + _T("';")); wszLEN = WideCharToMultiByte(CP_ACP, 0, sSQLline.GetBuffer(), -1, NULL, 0, NULL, NULL);
WideCharToMultiByte(CP_ACP, 0, sSQLline.GetBuffer(), -1, tmp2, wszLEN+1, NULL, NULL);
sqlite3_exec(m_pDB, tmp2, 0, 0, NULL); //Update ListCtrl
m_ListCtrl.SetItemText(i,1,m_ListCtrl.GetItemText(i, 4));
m_ListCtrl.SetItemText(i,2,m_ListCtrl.GetItemText(i, 5));
m_ListCtrl.SetItemText(i,3,m_ListCtrl.GetItemText(i, 6));
}
}
}这里不加delete [] tmp1;delete [] tmp2;运行会造成内存泄漏
但是如果加上这两句delete[]; delete[]本身会出错 这个和sqlite3有关系么?void CMAC_SearchDlg::m_Search()
{ //SearchSample
if(!m_IPAdd.IsBlank()){
m_isRunning = TRUE;
m_ListCtrl.DeleteAllItems();
BYTE nField0(0),nField1(0),nField2(0),nField3(0);//IP Addreass BYTE
m_IPAdd.GetAddress(nField0, nField1, nField2, nField3);
for(int i = nField3, j = 0;i<256;i++){  //make list
CString temp;
temp.Format(_T("%d.%d.%d.%d"), nField0, nField1, nField2, i);
temp = _T("Searching Target: ") + temp;
SetDlgItemTextW(IDC_STATIC13, temp.GetBuffer());
temp.Format(_T("%d.%d.%d.%d"), nField0, nField1, nField2, i);
ULONG   ulLen(6);
wchar_t * szMac = new wchar_t[ulLen*3];
wchar_t * szHostName = new wchar_t[ulLen*10];
char* sSQLline = new char[64];
LVITEM item;
item.iItem = j;
item.mask = LVIF_TEXT; BOOL addFlag = FALSE;
CString szArgv[3];
sprintf(sSQLline, "select * from NodeInfo where IP_Add = '%d.%d.%d.%d';", nField0, nField1, nField2, i);
sqlite3_exec(m_pDB, sSQLline, _sql_select, szArgv, NULL); if(!szArgv[0].IsEmpty()){
m_ListCtrl.InsertItem(j, NULL);
item.pszText = szArgv[0].GetBuffer();
item.iSubItem = 1;
m_ListCtrl.SetItem(&item);
item.pszText = szArgv[1].GetBuffer();
item.iSubItem = 2;
m_ListCtrl.SetItem(&item);
item.pszText = szArgv[2].GetBuffer();
item.iSubItem = 3;
m_ListCtrl.SetItem(&item);
}
if(m_GetHostName(szHostName, i)){
if(szArgv[0].IsEmpty())
m_ListCtrl.InsertItem(j, NULL);
item.pszText = szHostName;
item.iSubItem = 4;
m_ListCtrl.SetItem(&item);
item.pszText = temp.GetBuffer();
item.iSubItem = 5;
m_ListCtrl.SetItem(&item);
addFlag = TRUE; }
if(m_GetMAC(szMac, i)){
item.pszText = szMac;
item.iSubItem = 6;
m_ListCtrl.SetItem(&item);

}

if(!szArgv[0].IsEmpty() || addFlag)
j++; delete[] sSQLline;
delete[] szMac;
delete[] szHostName;
} SetDlgItemTextW(IDC_STATIC13, _T("Searching Complete."));
}
m_isRunning = FALSE;
//SendMail
if(m_opDlg.m_isSendmail)
MessageBox(m_opDlg.m_buf); //send mail
}上面这堆代码请大伙儿还是注意三组new delete; 虽然new之后delete了,但还是会有memory leak的提示
是不是我new delete用错了 还是sqlite哪里用错了(___ ____!!!)
OTZ

解决方案 »

  1.   

    首先已知长度的数组,没有必要用new去创建
    另外,你定义的数组大小64是否足够大?看着有点玄.
      

  2.   

    楼上说得对,很可能是你申请的内存过小,new申请的内存,其实在你得到的地址前面,还有一段描述这块内存申请信息的数据,如果超界访问数组,就可能把后面的这个信息覆盖掉,到时候delete就会出错了。
      

  3.   

    你试试不用new用静态数组看看还报不报错
      

  4.   

    你new 就要你delete 
    sqlite不会管这些事
      

  5.   

    楼主单步调试一下,看看你的tmp1和tmp2是否是越界了!
      

  6.   

    你new的就你delete
    sqlite的方法,你看看它的说明,有些内存是它自动管理的。
      

  7.   

    申请的空间用来放一条sql语句 这个应该不会超过64吧 而且数组会报错这个太让我匪接了