急!模态对话框中存在的内存泄露
今天调试的时候发现,我在一个模态对话框中实现了一些功能,但是每次调用该对话框,内存都会上涨6M作用,让我很无语,感觉应该不是模态对话框本身的原因,我用的C... *dlg;dlg.domodal();
现将主要代码贴出,请大家帮我看看,最好能给出解决办法,谢谢。
个人感觉可能是数据库部分或Clis control的问题。
BOOL CRecordDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: 在此添加额外的初始化代码 //添加的代码 // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 DWORD dwStyle; // 设置新风格 dwStyle=::GetWindowLong(m_record_ctrlList.m_hWnd,GWL_STYLE); dwStyle|=LVS_REPORT | LVS_SHOWSELALWAYS | LVS_EDITLABELS; ::SetWindowLong(m_record_ctrlList.m_hWnd,GWL_STYLE,dwStyle); dwStyle=m_record_ctrlList.GetExtendedStyle(); dwStyle|=LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT;//LVS_EX_FULLROWSELECT 点击选择一行 m_record_ctrlList.SetExtendedStyle(dwStyle); m_record_ctrlList.InsertColumn(0,"气象",LVCFMT_CENTER,30); m_record_ctrlList.InsertColumn(1,"编号",LVCFMT_CENTER,75); m_record_ctrlList.InsertColumn(2,"船舶名称",LVCFMT_CENTER,100); m_record_ctrlList.InsertColumn(3,"数量",LVCFMT_CENTER,75); m_record_ctrlList.InsertColumn(4,"航向",LVCFMT_CENTER,50); m_record_ctrlList.InsertColumn(5,"值班员",LVCFMT_CENTER,120); m_record_ctrlList.InsertColumn(6,"备 注",LVCFMT_CENTER,200); //m_ship_ctrlList.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); //m_ship_ctrlList.SetColumnWidth(0,160); m_timeStart = CTime(2012,1,1,0,0,0,-1);//获得当前时间 m_timeEnd = CTime::GetCurrentTime(); UpdateData(false); //打开ADO的连接 m_pRS.ADOOpen(); //在列表中显示用户 ShowListItems(); ShowCombo();//显示气象中的信息编号 return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE}void CRecordDlg::ShowListItems(){ //添加的代码:从数据库中获取选择用户名的资料 //清列表框的头 /*int nCount=0; CHeaderCtrl *pHeaderCtrl=m_record_ctrlList.GetHeaderCtrl(); if(pHeaderCtrl!=NULL) nCount=pHeaderCtrl->GetItemCount(); for(int i=0;i<nCount;i++) m_record_ctrlList.DeleteColumn(0);*/ m_record_ctrlList.DeleteAllItems(); m_pRS.ADOExcute("select [weather],[no],[shipname],[count],[heading],[staff],[remark] from Record"); //显示数据库中的表头 int nItem=0; while(!m_pRS.ADOEOF()){ m_record_ctrlList.InsertItem(nItem,m_pRS.GetFieldString(0)); for(int i=1;i<m_pRS.nFieldCols;i++) m_record_ctrlList.SetItemText(nItem,i,m_pRS.GetFieldString(i)); m_pRS.MoveNext(); } //m_ctrlList.SetRedraw(TRUE);}void CRecordDlg::OnButtonRefresh() //刷新{ ShowListItems();}void CRecordDlg::OnButtonAdd() { // 添加:password,user等是SQL语言中的保留字,在执行此类SQL操作时应加上方括号 Find(); CString dutystr = headdutystr+"(主)/"+voicedutystr+"(副)"; CString m_timeDate = CTime::GetCurrentTime().Format("%Y-%m-%d");//插入时间 全格式:("%Y/%m/%d/%a %H:%M:%S") UpdateData(true); CString sql; sql.Format("INSERT INTO Record([weather],[no],[shipname],[count],[heading],[staff],[remark]) Values ('%s','%s','%s','%s','%s','%s','%s')",weatherstr,m_strNO,m_strShipname,m_strCount,m_strHeading,dutystr,m_strRemark);// if(m_strNO=="") { AfxMessageBox("请将通行指挥记录填写完整!"); } else { if(m_pRS.ADOExcuteNoQuery(sql)==1) { AfxMessageBox("增加记录成功!"); //增加完记录后,马上刷新显示; ShowListItems(); } else { AfxMessageBox("增加记录失败!"); } } }void CRecordDlg::AddListItems()//为查询做准备{ //清列表框的头,列,行 int nCount=0; CHeaderCtrl *pHeaderCtrl=m_record_ctrlList.GetHeaderCtrl(); if(pHeaderCtrl!=NULL) nCount=pHeaderCtrl->GetItemCount(); for(int i=0;i<nCount;i++) m_record_ctrlList.DeleteColumn(0); m_record_ctrlList.DeleteAllItems(); //取出字段名显示到列表头中 //显示数据库中的表头 /*for(int i=0;i<m_pRS.nFieldCols;i++) { m_ship_ctrlList.InsertColumn(i,m_pRS.GetFieldName(i),LVCFMT_LEFT,110); }*/ //自定义表头 m_record_ctrlList.InsertColumn(0,"气象",LVCFMT_CENTER,30); m_record_ctrlList.InsertColumn(1,"编号",LVCFMT_CENTER,75); m_record_ctrlList.InsertColumn(2,"船舶名称",LVCFMT_CENTER,100); m_record_ctrlList.InsertColumn(3,"数量",LVCFMT_CENTER,75); m_record_ctrlList.InsertColumn(4,"航向",LVCFMT_CENTER,50); m_record_ctrlList.InsertColumn(5,"值班员",LVCFMT_CENTER,120); m_record_ctrlList.InsertColumn(6,"备 注",LVCFMT_CENTER,200); //取出字段值放到列表行中 int nItem=0; while(!m_pRS.ADOEOF()){ m_record_ctrlList.InsertItem(nItem,m_pRS.GetFieldString(0)); for(int i=0;i<m_pRS.nFieldCols;i++) m_record_ctrlList.SetItemText(nItem,i,m_pRS.GetFieldString(i)); m_pRS.MoveNext(); }}void CRecordDlg::OnButtonRefer() //按日期查询{ CString strSQL; UpdateData(true); CString cstrDateStart = m_timeStart.Format("%Y-%m-%d %H:%M:%S");//CTime类型转化为CString类型 CString cstrDateEnd = m_timeEnd.Format("%Y-%m-%d %H:%M:%S");//CTime类型转化为CString类型 //m_pRS.ADOExcute("SELECT * FROM Record WHERE Date between '"+ cstrDateStart +"'and '"+ cstrDateEnd +"'");//自动按时间由近到远排序 strSQL.Format("SELECT [weather],[no],[shipname],[count],[heading],[staff],[remark] FROM RECORD WHERE markin between '%s' and '%s'",cstrDateStart,cstrDateEnd); m_pRS.ADOExcute(strSQL); if(m_pRS.nFieldRows != 0) { AddListItems(); } else { AfxMessageBox("查询结果:无匹配信息!"); return ; }}void CRecordDlg::ShowCombo()// Combo控件显示气象 wdj 2012年6月29日22:43:40{ ////添加的代码:从数据库中获取选择用户名的资料 //CRecordset rs; //rs.GetFieldValue("weather",str) _RecordsetPtr m_pRecordset2; m_pRecordset2.CreateInstance("adodb.recordset"); try { CString weatherstr; weatherstr.Format("select * from WEATHER"); _variant_t ordervar=(LPCTSTR)weatherstr;//## m_pRecordset2->Open(ordervar,m_pConn.GetInterfacePtr(),adOpenStatic,adLockReadOnly,adCmdText); } catch (_com_error e) { AfxMessageBox(e.ErrorMessage()); if (m_pRecordset2!=NULL) { m_pRecordset2->Close();//用完后,关闭数据集 m_pRecordset2=NULL; } //return FALSE; } try { if(!(m_pRecordset2->BOF))//若记录集指针未指向数据库中的首元素 { m_pRecordset2->MoveFirst();//则将其指向首元素位置 int Counter=0; CString weatherstr1; while (!m_pRecordset2->adoEOF)//若记录集指针未指向数据库中的尾元素,则循环永远不会结束 { if (m_pRecordset2->GetCollect("weather").vt!=VT_NULL) { weatherstr1 =(char*)(_bstr_t)m_pRecordset2->GetCollect("weather"); m_strWeather1.AddString(weatherstr1); } m_pRecordset2->MoveNext(); Counter++; } } if (m_pRecordset2!=NULL) { m_pRecordset2->Close();//用完后,关闭数据集 m_pRecordset2=NULL; } //return TRUE; } catch (_com_error e) { CString strError; strError.Format("%s",e.Description());//Description() AfxMessageBox(strError); if (m_pRecordset2!=NULL) { m_pRecordset2->Close();//用完后,关闭数据集 m_pRecordset2=NULL; } //return FALSE; }}