⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_50397.htm

📁 vc
💻 HTM
字号:
<p>
序号:50397 发表者:草叶 发表日期:2003-08-20 17:24:37
<br>主题:怎样删除记录集指针?
<br>内容:我在一个对话框的oninitdialog()中建立了几个记录集指针(头文件中已声明),在onok或oncancel中使用<BR>delete C*set; <BR>C*set=NULL;<BR>进行删除,在关闭对话框时出错,我看了有些例子,在对话框中用new生成的记录集指针对象,在ondestory中进行了删除,哪位高人讲解一下为什么要这样做?这个消息函数是怎样被调用的?<BR>用new生成的对象如果不用delete删除,会造成内存泄漏,这会造成什么后果?
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:金枪鱼 回复日期:2003-08-20 20:41:04
<br>内容:在生成记录集指针的地方<BR>CRecordset *pRs=new CRecorset(pDb);<BR>ASSERT(pRs!=NULL);<BR>-----<BR>在对话框销毁时要释放这个内存<BR>if(pRs-&gt;IsOpen()) pRs-&gt;Close();//如果记录集打开状态,就关闭<BR>delete pRs;//销毁记录集指针<BR>pRs=NULL;//避免野指针<BR>----<BR>用new分配的指针,使用完毕必须使用delete来释放。否则内存泄漏。<BR>----<BR>对话框不同的关闭方式,其处理消息过程是不同,但无论那种销毁方式,都要发送WM_DESTROY消息,所以一般在OnDestroy消息处理函数中释放记录集的指针。如果你使用OnClose()或者OnOK或者OnCancel函数来释放,那么必须对对话框的某些功能进行修改,以保证对话框销毁时能够运行相应的消息处理函数。请看看MSDN的对话框的生命周期,弄清各种消息的发送过程。像WM_CLOSE这些消息,在某些关闭方式下,是不发送这个消息的。<BR>记住,只有WM_DESTROY消息才是一定会发送的。<BR>----<BR>delete C*set; <BR>C*set=NULL;<BR>你这个写法似乎有些不对,前面加一个C*是什么意思?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:草叶 回复日期:2003-08-21 12:56:36
<br>内容:谢谢鱼哥回复。<BR>*号是通配符,<BR>“如果你使用OnClose()或者OnOK或者OnCancel函数来释放,那么必须对对话框的某些功能进行修改,”,修改哪些地方?<BR><BR>用new生成的对象如果不用delete删除,会造成内存泄漏,这会造成什么后果?我的程序现在没有删除这些记录集指针,还没发现什么问题。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:金枪鱼 回复日期:2003-08-21 20:13:27
<br>内容:1、由于关闭对话框的方式不同,它发送的消息就不同。因此,你如果采用在某个消息处理函数中清理内存,则要可定对话框关闭时会处理发出这个消息。对于不发送这个消息的关闭对话框操作要屏蔽其缺省的关闭对话框的功能,以免没有清理内存而导致内存泄漏。<BR>&nbsp;&nbsp; 下面时对话框关闭方式不同发送的消息:<BR>&nbsp;&nbsp; 1)点击OK按钮:OnOk-WM_DESTROY<BR>&nbsp;&nbsp; 2) 点击Cancel按钮:OnCancel-WM_DESTROY<BR>&nbsp;&nbsp; 3) 点击×按钮:WM_CLOSE-ONCANCEL-WM_DESTROY<BR>&nbsp;&nbsp; 4) 键盘ESC按键:OnCancel-WM_DESTROY<BR>&nbsp;&nbsp; 5)调用EndDialog(IDCANCEL),直接到WM_DESTROY消息<BR>&nbsp;&nbsp; 所示所,WM_Destroy消息时对话框关闭时肯定要处理的消息。<BR>&nbsp;&nbsp;举个例子,如果你在OnClose函数中清理内存,则如果用户使用ESC按键退出对话框,就不会执行OnClose函数中清理内存的代码,导致内存泄漏。在这种情况下,你不要屏蔽对话框使用ESC按钮退出的功能,以便保证用户不用这种方式关闭对话框,而确保内存得到清理。<BR><BR>2、内存泄漏的后果:轻则系统死机,重则系统崩溃!!!!<BR>&nbsp;&nbsp; 如果你仅仅执行一个暂用很小内存的代码而没有清理,可能影响不大,你的程序退出后,系统可能会回收内存。重启计算机也可以解决这个内存问题。<BR>&nbsp;&nbsp; 但是,如果你的程序只多次或者大量的动态分配内存,而没有清理,系统资源就会在你的程序的执行过程中耗尽,系统就死机了。<BR>&nbsp;&nbsp; 我们的程序是共用户使用的,用户可能会不多次调用你没有清理内存的过程,而且你的程序还经常会循环使用这个过程。想想看,内存泄漏的后果吧!<BR>&nbsp;&nbsp; 另外,你的指针不清理,如果你的代码不小心用到了它,由于它的指向的内存不确定,你的操作很可能就会破坏你的整个系统,导致系统崩溃!!<BR>&nbsp;&nbsp;所以,new的产物,一定要记住在使用完毕后清理内存,如果是指针还需要避免野指针的出现。不饶存任何侥幸心理。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:草叶 回复日期:2003-08-24 14:09:22
<br>内容:谢谢鱼哥
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -