今天在调试代码中发现一个问题,就是基于对话框的一个demo,在录制完一段码流,并且将详细信息显示在edit中,当结束录制的时候,直接点击退出(onok),然后就会报告内存泄漏:
Detected memory leaks!
Dumping objects ->
strcore.cpp(118) : {124} normal block at 0x004327E0, 38 bytes long.
Data: < 1 > 02 00 00 00 19 00 00 00 19 00 00 00 B5 DA 31 B8
strcore.cpp(118) : {122} normal block at 0x00432890, 52 bytes long.
Data: < ' > 01 00 00 00 08 00 00 00 27 00 00 00 C8 CE CE F1
Object dump complete.
初始以为是CString的问题,但经过检查在代码中凡是调用str.GetBuffer(0)的地方,都调用了相应的str.RealeaseBuffer()。在代码的多个线程中也没有调用new char[],排除CString的问题。怀疑是多个线程在
退出的时候,有的变量没有释放,但是每个线程中对应的new都有delete。
关键的关键是这个内存错误在调试状态下,总是一闪而逝,让我想不明白,我在认为可能出现bug的地方都
加了断点,没辙了,想到了最老土的方法,用print screen来捕捉这个错误,还好天无绝人之路,捕捉成功,发现是debug assertion failed!
File: afxwin2.inl
Line:797
发现问题所在,这下就好办了,找到afxwin2.inl(VC安装路径\VC98\MFC\Include),定位在797行,发现是:
_AFXWIN_INLINE CEdit::CEdit()
{ ASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, EM_GETLINECOUNT, 0, 0); }
分析原因,当点击主对话框demo的退出按钮时,直接是(onok),那么由于demo中有多个线程共同调用主对话框的edit,为防止线程冲突,为edit加锁,当主对话框onok后,先将所有的线程结束,并释放掉占用的资源后,主对话框将会析构。但是由于为edit加锁,对edit的writelog功能还没有结束,但此时edit的父窗口主对话框已经被析构掉了,从而会报错。
改正:将退出按钮重新设置一个,不要用对话框的onok,问题解决。
浙公网安备 33010602011771号