首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

急模态对话框中存在的内存储器泄露

2012-08-01 
急!模态对话框中存在的内存泄露今天调试的时候发现,我在一个模态对话框中实现了一些功能,但是每次调用该对

急!模态对话框中存在的内存泄露
今天调试的时候发现,我在一个模态对话框中实现了一些功能,但是每次调用该对话框,内存都会上涨6M作用,让我很无语,感觉应该不是模态对话框本身的原因,我用的C... *dlg;dlg.domodal();
现将主要代码贴出,请大家帮我看看,最好能给出解决办法,谢谢。
个人感觉可能是数据库部分或Clis control的问题。

C/C++ code
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;    }} 



[解决办法]
是不是没关闭数据库引起的?
[解决办法]
顶1楼,应该是数据库没有关闭的原因
[解决办法]
m_pRS是不是没有关闭?如果不关闭,那内存就会释放不了
[解决办法]
好的习惯,不用的指针要释放,智能指针不用要关闭,不需要程序员释放;

热点排行