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

DEDE2000 2012-07-06 12:05:24
今天调试的时候发现,我在一个模态对话框中实现了一些功能,但是每次调用该对话框,内存都会上涨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;
}
}
...全文
184 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
DEDE2000 2012-07-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
是不是没关闭数据库引起的?
[/Quote]
您好,能具体说说嘛?我今天用m_pRS.ADOclose关闭,行吗?能说说您的想法嘛?
gold_water 2012-07-06
  • 打赏
  • 举报
回复
好的习惯,不用的指针要释放,智能指针不用要关闭,不需要程序员释放;
Barcode 2012-07-06
  • 打赏
  • 举报
回复
m_pRS是不是没有关闭?如果不关闭,那内存就会释放不了
jiuzhoulh 2012-07-06
  • 打赏
  • 举报
回复
顶1楼,应该是数据库没有关闭的原因
zgl7903 2012-07-06
  • 打赏
  • 举报
回复
是不是没关闭数据库引起的?
c++面试题53个问题 1.C++的三大特性 2.C和C++的区别 3.全局变量和局部变量在内存分配上有何不同 4.static的作用 5.const解释其作用 6.指针和引用的区别 7.智能指针 8.简述深拷贝和浅拷贝的区别 9.编写my_strcpy函数,实现与库函数strcpy类似的功能,不能使用任何库函数 10.请讲述堆和栈的区别 11.全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的 12.new、delete、malloc、free之间的关系 13. 头文件种的ifndef/define/endif 是干什么用的 14.TCP和UDP有什么区别 15.STL库用过吗?常见的STL容器有哪些?算法用过哪几个 16.同步IO和异步IO的区别 17.说下你对内存的了解 18.C++文件编译与执行的四个阶段 19.extern关键字的作用 20.#define和const的区别 21.结构体struct和共同体union(联合)的区别 22.C++vector和list的区别 23.结构体和类的区别 24.STLmap和set的原理(关联式容器) 25.MFC的消息机制 26.消息映射 27.列举几种进程的同步机制,并比较其优缺点 28.数组和链表的区别 29.MFC主要要用到哪几个类?及其各个类的作用 30.MFC六大核心机制 31.OnDraw和OnPaint 32.win32程序的消息响应机制是如何实现的 33.MFC的消息响应机制是如何实现的 34.WM_COMMAND命令消息处理顺序 35.MFC序列化的概念 36.PeekMessage和GetMessage的主要区别 37.WIN32创建窗口程序基本函数 38.Windows的系统消息循环占用CPU的疑问 39.队列消息与非队列消息 40.GDI对象绘图步骤 41.设备上下文DC 42.GDI位图绘制步骤 43.当模态对话框点开后,主窗口还能响应处理消息吗 44.MFC的消息分类 45.CListCtrl 虚拟列表技术 46.虚函数是怎么实现的 47.什么是内存泄漏?面对内存泄漏和指针越界,你有哪些方法? 48.变量的声明和定义有什么区别 49.sizeof是一个操作符,strlen是库函数 50.写一个“标准”宏MIN 51.简述strcpy sprintf与mencpy的区别 52.链表与数组的区别 53.简述队列和栈的异同
第一章 起步篇 8 本章概述 8 书写本书的背景 8 运用本书 9 IDL所需的版本 9 IDL运行期间所需颜色的数量 9 本书的风格习惯 10 本书所用的IDL程序和数据文件 12 获取更多的帮助 14 使用IDL命令 14 IDL命令解析 14 创建变量 17 使用IDL图形窗口 22 第二章 简单的图形显示 25 本章概述 25 IDL简单的图形显示 25 创建线画图 25 定制线画图 28 改变线条的线型和粗细 28 用符号代替线条显示数据 29 用不同的颜色绘制线画图 31 限定线画图的范围 31 改变线画图的风格 32 在线画图上绘出多种数据集 34 在多个轴的图上显示数据 35 创建曲面图 36 定制曲面图 38 旋转曲面图 38 为曲面赋色 39 修改曲面图外观 40 创建阴影曲面图 41 改变阴影处理参数 41 用其它数据集为阴影处理提供参数 42 创建等值线图 43 选择等值线数目 45 修改等值线图 46 改变等值线图的外观 47 给等值线图赋色 48 创建填充的等值线图 49 在显示窗口定位图形输出 51 设置图形边缘 52 设置图形位置 52 设置图形区域 53 创建多个图形 53 给图形显示添加文本 57 找出可用字体的名称 58 用XYOutS命令添加文本 58 用矢量字体使用XYOut 59 排列文本 60 删除文本 61 改变文本的方向 61 给图形显示添加线和符号 61 图形显示添加色彩 62 第三章 图像数据处理 65 本章概要 65 图像处理 65 显示图像 65 调整图像数据 67 显示24位图像 69 控制图像显示顺序 70 改变图像尺寸 70 在显示窗口定位图像 72 从显示器读取图像 75 IDL基本的图像处理 75 直方图均衡化 76 平滑图像 77 增强图像棱边 79 图像的频域滤波 80 第四章 图形显示技术 83 本章概要 83 IDL的颜色运用 83 使用索引颜色模式和RGB颜色模式 83 在24位显示设备上装载色谱表 88 获得色谱表的拷贝 88 修改和创建色谱表 89 保存自己的色谱表 90 创建自己的轴标注 91 调整轴刻度间隔 91 格式化轴的标注 92 用IDL处理残缺的数据 95 用IDL建立三维坐标系 97 建立三维散点图 97 从图形原点定位3D坐标轴 99 组合简单图形显示 100 IDL的动画数据 102 建立动画工具 103 装载动画缓冲区 103 运行动画工具 103 动画的控制 103 存储动画的像素映射图 104 其它类型图形数据的动画 104 网格化数据以便图形显示 105 德洛内三角形法网格化 106 数据的球形网格化 108 第五章 图形显示技巧 110 本章概要 110 将光标用于图形显示 110 什么时候返回的光标位置? 110 哪一个鼠标键和光标共同作用呢? 111 用光标标注图形输出 111 在图像上使用Cursor命令 113 在循环使用Cursor命令 113 从显示删除注释 114 删除注释的异或法 114 删除注释的设备拷贝法 116 Z图形缓冲区的图形显示技巧 120 Z图形缓冲区的实现 121 一个Z图形缓冲区实例:两个曲面 121 用Z图形缓冲区使图像变形 123 Z图形缓冲区的透明效果 126 将Z图形缓冲区效果与体数据着色相结合 127 第六章 在IDL读写数据 129 本章概要 129 打开文件进行读写 129 查找和选择数据文件 130 获取逻辑设备号 131 读写格式化数据 132 写自由格式文件 133 读写自由格式文件的实例 136 用确定的文件格式写入 139 从字符串读取格式数据 141 读写非格式化数据 141 读取非格式化图像数据文件 142 写非格式化图像数据文件 142 非格式化数据文件的一些问题 144 用关联变量存取非格式化数据文件 144 读写常用文件格式的文件 147 创建彩色GIF文件 147 创建彩色JPEG文件 148 查询图像文件信息 150 第七章 图形硬拷贝输出 151 本章概要 151 选择图形硬拷贝输出设备 151 配置图形硬拷贝输出设备 152 常用的Device命令关键字 153 创建PostScript文件 154 将图形送到硬拷贝设备 154 打印PostScript文件 155 在运行MacOS系统的计算机上打印PostScript文件 156 在Windows计算机上打印PostScript文件 156 生成封装的PostScript文件输出 156 封装PostScript图形的预览 157 生成彩色的PostScript输出 157 PostScript的彩色图像与灰度图像 158 在PostScript设备上创建高质量的输出 159 显示设备和PostScript设备之间的相同点 159 显示设备与PostScript设备之间的不同点 159 在横向输出模式计算PostScript的偏移量 172 用PS_Form配置PostScript设备 173 配置和使用打印设备 174 用打印设备定位图形 175 第八章 IDL编程基础 178 本章概述 178 编写IDL批处理文件 178 编写IDL主程序 179 过程和与函数变量的作用范围 181 创建定位参数 181 定义可选的或必须的定位参数 182 定义关键字 183 创建输出型参数 186 编写IDL函数 189 方括号和函数的调用 190 使用程序控制语句 191 IDL表达式的真和假 191 将多个语句处理成单个语句 192 If…Then…Else控制语句 192 条件表达式 194 FOR循环控制语句 194 WHILE循环控制语句 194 REPEAT...UNTIL 循环控制语句 194 CASE控制语句 195 GOTO控制语句 195 错误处理控制语句 196 编译和执行IDL程序模块 198 程序编译规则: 198 程序编译和自动运行规则 199 特殊编译命令 199 第九章 编写 IDL 程序 201 本章概述 201 基本的ImageBar程序 201 给程序ImageBar增加一个“先擦除”功能 205 向ImageBar程序增加颜色敏感功能 205 给ImageBar的命令传递关键字 207 根据窗口大小改变字符大小 209 程序ImageBar的最终代码 210 在图形用户界面包装ImageBar 211 第十章 编写简单的组件程序 212 本章概述 212 组件程序的结构 212 组件程序如何对事件作出反应 213 编写组件定义模块 213 定义和创建程序组件 214 在屏幕上实现组件 216 使绘图组件成为当前图形窗口 216 在绘图组件窗口上显示图形 216 保存程序运行时所需要的信息 216 创建事件循环和注册程序 217 运行程序 218 创建无阻塞组件程序 219 编写事件处理模块 219 事件结构的公共字段 219 事件处理函数 220 将事件处理程序和组件联系起来 221 编写Quit按钮的事件处理程序 222 编写改变图形窗口大小的事件处理程序 223 进行小量地修改 224 添加颜色敏感 224 采用更高效的内存管理 225 第十一章 组件编程技巧 229 本章概述 229 改变颜色表 229 保护公共块 230 一个可选择颜色表的工具 230 指定Group Leader 233 给组件程序增加Group Leader 234 在24位显示器上改变颜色表 235 在组件程序使用指针 237 使用Cleanup过程防止内存泄露 238 使用伪事件进行程序通信 239 创建一个具有“记忆功能”的程序 240 保护组件程序的颜色 243 通过组件跟踪事件来保护颜色 244 通过绘图组件事件来保护颜色 245 保存或者发布程序的图形 245 第十二章 对话框程序 249 本章概述 249 创建模式对话框 249 阻塞的组件程序 249 模式组件程序 250 编写模式对话框的定义模块 250 编写模式对话框的事件处理模块 254 测试模式对话框程序 255 创建非模式的对话框 256 编写非模式对话框程序 256 编写非模式对话框的事件处理模块 258 测试非模态对话程序 259 附录A 组件的事件结构 261 事件结构的定义 261 公共字段的定义 261 基本组件的事件结构 261 base组件 261 按钮组件 261 绘图组件 262 下拉式列表组件 262 标签组件 262 列表组件 262 滑动条组件 262 表单组件 263 文本组件 264 复合组件的事件结构 265 CW_Animate 265 CW_Arcball 265 CW_BGroup 265 CW_Clr_Index 265 CW_Color_Sel 265 CW_DefROI 266 CW_Field 266 CW_Form 266 CW_Flisder 266 CW_Orient 266 CW_PDMenu 266 CW_RGBSlider 266 CW_Zoom 267 组件程序的事件结构 267 Xcolors 267 其他组件的事件结构 267 键盘焦点事件 267 组件退出请求事件 267 组建计时器事件 268 组件跟踪事件 268 附录B 数据文件描述 269

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧