用vc2010开发的mfc单文档程序,使用了多线程、sql server2000数据库、UDP收发数据,
程序关闭退出时,提示内存泄露:
Detected memory leaks!
Dumping objects ->
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {188279} normal block at 0x03416A68, 56 bytes long.
Data: < x > 84 CF B1 78 13 00 00 00 13 00 00 00 01 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {187156} normal block at 0x033FA058, 26 bytes long.
Data: < x > 84 CF B1 78 04 00 00 00 04 00 00 00 02 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {187151} normal block at 0x03381DE0, 406 bytes long.
Data: < x > 84 CF B1 78 C2 00 00 00 C2 00 00 00 01 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(188) : {187149} normal block at 0x03414FF0, 92 bytes long.
Data: < x% % > 84 CF B1 78 25 00 00 00 25 00 00 00 03 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {187148} normal block at 0x034139D0, 88 bytes long.
Data: < x# # > 84 CF B1 78 23 00 00 00 23 00 00 00 01 00 00 00
{186975} normal block at 0x03416890, 24 bytes long.
Data: <H 9 s@ dA X6A > 48 C8 39 03 10 73 40 03 F0 64 41 03 58 36 41 03
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {186974} normal block at 0x034161D8, 38 bytes long.
Data: < x > 84 CF B1 78 0A 00 00 00 0A 00 00 00 02 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {186911} normal block at 0x034164E0, 38 bytes long.
Data: < x > 84 CF B1 78 0A 00 00 00 0A 00 00 00 01 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {186904} normal block at 0x034163E8, 182 bytes long.
Data: < xR R > 84 CF B1 78 52 00 00 00 52 00 00 00 01 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {186893} normal block at 0x0339C838, 44 bytes long.
Data: < x > 84 CF B1 78 0D 00 00 00 0D 00 00 00 01 00 00 00
{186889} normal block at 0x033838D0, 8 bytes long.
Data: < $ > 9C F4 24 06 00 00 00 00
{186887} normal block at 0x03383C48, 12 bytes long.
Data: < s@ X6A 9 > 10 73 40 03 58 36 41 03 E0 C7 39 03
{186885} normal block at 0x0039D0A0, 8 bytes long.
Data: < $ > F8 F4 24 06 00 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {186880} normal block at 0x03413DF8, 194 bytes long.
Data: < xX X > 84 CF B1 78 58 00 00 00 58 00 00 00 01 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {186879} normal block at 0x033D8E88, 20 bytes long.
Data: < x > 84 CF B1 78 01 00 00 00 01 00 00 00 01 00 00 00
{186878} normal block at 0x03400D50, 12 bytes long.
Data: < s@ X6A 9 > 10 73 40 03 58 36 41 03 E0 C7 39 03
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(188) : {186877} normal block at 0x0339C7D0, 44 bytes long.
Data: < x > 84 CF B1 78 0A 00 00 00 0D 00 00 00 04 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(188) : {186869} normal block at 0x03413648, 44 bytes long.
Data: < x > 84 CF B1 78 0A 00 00 00 0D 00 00 00 03 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(188) : {186861} normal block at 0x03407300, 44 bytes long.
Data: < x > 84 CF B1 78 0A 00 00 00 0D 00 00 00 04 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {186854} normal block at 0x03412A98, 20 bytes long.
Data: < x > 84 CF B1 78 01 00 00 00 01 00 00 00 01 00 00 00
{186853} normal block at 0x034124A8, 8 bytes long.
Data: <P $ > 50 F6 24 06 00 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {186852} normal block at 0x0339C8E8, 36 bytes long.
Data: < x > 84 CF B1 78 09 00 00 00 09 00 00 00 02 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp(306) : {32379} client block at 0x034123C0, subtype c0, 68 bytes long.
a CWinThread object at $034123C0, 68 bytes long
Object dump complete.
思路:可以用鼠标在其中的一个提示上双击,一般就会跳到泄露内存的地方,这样就可以看出是哪个变量没被释放,另外,可以先把操作数据库的代码屏蔽掉,看看还有没有,如果还有,就再屏蔽UDP通信,一个一个试,逐渐缩小范围查找。
解决途径:
问题解决了,估计是关闭软件析构产生的问题:
1、MainFrm类收到UDP数据并处理后,向View类发送消息SendMessage要求更新View图形显示;
---SendMessage发送后,View已经析构掉,故不能返回;
2、MainFrm类收到UDP数据并处理后,向MainFrm类的控件成员变量更新显示字符串;
---在析构的时候,操作到了已经不存在的控件成员变量