VS2010 _MFC程序_内存泄露问题

时间:2021-12-05 05:43:09
debug的时候窗口中出现如下提示:

Detected memory leaks!
Dumping objects ->
{15083} normal block at 0x0316CC78, 752 bytes long.
 Data: <    y       R   > 0F 00 00 00 79 01 00 00 12 00 00 00 52 01 00 00 
{2425} normal block at 0x01E41138, 68 bytes long.
 Data: <, dP`   @   <   > 2C 20 64 50 60 10 E3 01 40 03 00 00 3C 03 00 00 
{2424} normal block at 0x01EEB098, 8 bytes long.
 Data: <        > 90 1C E3 01 D0 0F E4 01 
{2423} normal block at 0x01E410E0, 28 bytes long.
 Data: <                > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

找了很久,没有看出哪里有问题。
下了一个 DevPartner Visual C++ Boundschecker 11.0000
安装之后,在vs2010的菜单里面没有看到它·········
也没有找到很多关于他的资料。

上面的debug输出信息中,已经有
 内存分配序号  内存块的类型  内存位置  的内存块的大小
等信息了。如何利用这些信息查找内存泄露的位置呢?

VS2010 _MFC程序_内存泄露问题
malloc的都free了。。。。啊。。。到底是哪里有问题呢。。





+++++++++++++++++++
ps:
程序中为了得到窗口位置声明的这些变量:

CDC *pDC;
pDC =pwnd->GetDC();

这样的指针,需要··释放么?


19 个解决方案

#1


ReleaseDC

#2


有地方忘记的

或者 你把malloc的注释掉



排除法

#3


ReleaseDC(pDC);

#4


使用 DEBUG_NEW macro 这样new而没有delete的地方 在调试输出中会有明显的提示

#5


{2425} normal block at 0x01E41138, 68 bytes long.

看见前面这个2425没有?
你多试几次。如果几次都有2425这样的块号,你就用_crtBreakAlloc函数设置这个块号。
然后再分配这个块号的地址时就会中断下来。你就知道是哪个东西分配的地址了。

#6


双击对应的行也不能定位吗?

#7



引用 1 楼 arpnet99 的回复:
ReleaseDC


哦。对哈。都忘了。
在MFC中获得pic空间,经常这样,但是总忘记释放。
顺便问下,搞不清楚这几个:

CRect rect;
CDC *pDC;
HDC hDC;
CWnd *pwnd;

pwnd = GetDlgItem(IDC_PIC);   
pDC =pwnd->GetDC();
hDC= pDC->GetSafeHdc();
pwnd->GetClientRect(&rect);


这样,ReleaseDC(pdc);
之后呢?
那个 CWnd的怎么释放撒?

#8


引用 2 楼 sha_jinhao 的回复:
有地方忘记的

或者 你把malloc的注释掉

排除法


VS2010 _MFC程序_内存泄露问题 其实我用了opencv里面的函数。。。。。。感觉。。。。排除的好痛苦啊。。。。。

#9


pwnd = GetDlgItem(IDC_PIC);   

这个 不需要你释放

#10


引用 9 楼 sha_jinhao 的回复:
pwnd = GetDlgItem(IDC_PIC);   

这个 不需要你释放


VS2010 _MFC程序_内存泄露问题
嗯 

不过,还是有问题 VS2010 _MFC程序_内存泄露问题  除此之外,全局变量中就有一个vector 了

这样声明的:
vector< CvPoint> PointVector;
然后,在程序退出的时候,这样释放空间的:
vector< CvPoint>().swap(PointVector);

VS2010 _MFC程序_内存泄露问题 对不对 呢。。。。


VS2010 _MFC程序_内存泄露问题   

刚开始跑程序的时候内存使用情况:

VS2010 _MFC程序_内存泄露问题
不过我跑了10min程序后,内存使用情况如下: 

VS2010 _MFC程序_内存泄露问题


额 我刚想说,前后变化不大呢。。。结果程序就崩了。。。。

#11


然后,在程序退出的时候,这样释放空间的:
vector< CvPoint>().swap(PointVector);

-------------------------------------------
释放空间做什么?


里面存储的又不是指针!

#12


引用 11 楼 sha_jinhao 的回复:
然后,在程序退出的时候,这样释放空间的:
vector< CvPoint>().swap(PointVector);

-------------------------------------------
释放空间做什么?


里面存储的又不是指针!



VS2010 _MFC程序_内存泄露问题
不是vector 不会释放空间的么。。。。。
不是他会提前申请一大块空间,但是他不会自己释放的么。。。我还特意搜的释放方法。。。额 VS2010 _MFC程序_内存泄露问题

#13


引用 4 楼 zgl7903 的回复:
使用 DEBUG_NEW macro 这样new而没有delete的地方 在调试输出中会有明显的提示


为什么   我只是 运行, 在木有跑程序前,关掉 了这个 对话框 ,还会出现 内存泄露呢 VS2010 _MFC程序_内存泄露问题

vs2010 新建了一个 dlg ,
什么都没做,提示:

Detected memory leaks!
Dumping objects ->
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp(4500) : {270} client block at 0x002DCF90, subtype c0, 56 bytes long.
a CObject object at $002DCF90, 56 bytes long
c:\users\administrator.qqqpolimqc7hmgn.000\desktop\智驱\test\test\test.cpp(59) : {257} client block at 0x002DC758, subtype c0, 12 bytes long.
a CObject object at $002DC758, 12 bytes long
{256} client block at 0x002DC8F0, subtype c0, 204 bytes long.
a CObject object at $002DC8F0, 204 bytes long


VS2010 _MFC程序_内存泄露问题  很头疼啊。。。 下的 BoundsCheck 安装后,在 10 中也没显示出来。。郁闷哦 VS2010 _MFC程序_内存泄露问题

#14


http://blog.csdn.net/chenyujing1234/article/details/8075667

你看看这个

#15


按f4或者双击应该有反应的

#16


正解!
引用 5 楼 ydfivy 的回复:
{2425} normal block at 0x01E41138, 68 bytes long.

看见前面这个2425没有?
你多试几次。如果几次都有2425这样的块号,你就用_crtBreakAlloc函数设置这个块号。
然后再分配这个块号的地址时就会中断下来。你就知道是哪个东西分配的地址了。

#17


遇到同样问题,使用5楼的方法解决了。

#18


我也遇到这个问题。。。新建了个工程,加了检查内存的代码,直接就告诉我有内存泄露。看到任务管理器也确实在增加,这应该算是MFC的BUG吧。。什么都没动都有泄露。

#19


可能是opencv 库文件的问题吧,链接上就有内存泄漏了,楼主后来是怎么解决的?

#1


ReleaseDC

#2


有地方忘记的

或者 你把malloc的注释掉



排除法

#3


ReleaseDC(pDC);

#4


使用 DEBUG_NEW macro 这样new而没有delete的地方 在调试输出中会有明显的提示

#5


{2425} normal block at 0x01E41138, 68 bytes long.

看见前面这个2425没有?
你多试几次。如果几次都有2425这样的块号,你就用_crtBreakAlloc函数设置这个块号。
然后再分配这个块号的地址时就会中断下来。你就知道是哪个东西分配的地址了。

#6


双击对应的行也不能定位吗?

#7



引用 1 楼 arpnet99 的回复:
ReleaseDC


哦。对哈。都忘了。
在MFC中获得pic空间,经常这样,但是总忘记释放。
顺便问下,搞不清楚这几个:

CRect rect;
CDC *pDC;
HDC hDC;
CWnd *pwnd;

pwnd = GetDlgItem(IDC_PIC);   
pDC =pwnd->GetDC();
hDC= pDC->GetSafeHdc();
pwnd->GetClientRect(&rect);


这样,ReleaseDC(pdc);
之后呢?
那个 CWnd的怎么释放撒?

#8


引用 2 楼 sha_jinhao 的回复:
有地方忘记的

或者 你把malloc的注释掉

排除法


VS2010 _MFC程序_内存泄露问题 其实我用了opencv里面的函数。。。。。。感觉。。。。排除的好痛苦啊。。。。。

#9


pwnd = GetDlgItem(IDC_PIC);   

这个 不需要你释放

#10


引用 9 楼 sha_jinhao 的回复:
pwnd = GetDlgItem(IDC_PIC);   

这个 不需要你释放


VS2010 _MFC程序_内存泄露问题
嗯 

不过,还是有问题 VS2010 _MFC程序_内存泄露问题  除此之外,全局变量中就有一个vector 了

这样声明的:
vector< CvPoint> PointVector;
然后,在程序退出的时候,这样释放空间的:
vector< CvPoint>().swap(PointVector);

VS2010 _MFC程序_内存泄露问题 对不对 呢。。。。


VS2010 _MFC程序_内存泄露问题   

刚开始跑程序的时候内存使用情况:

VS2010 _MFC程序_内存泄露问题
不过我跑了10min程序后,内存使用情况如下: 

VS2010 _MFC程序_内存泄露问题


额 我刚想说,前后变化不大呢。。。结果程序就崩了。。。。

#11


然后,在程序退出的时候,这样释放空间的:
vector< CvPoint>().swap(PointVector);

-------------------------------------------
释放空间做什么?


里面存储的又不是指针!

#12


引用 11 楼 sha_jinhao 的回复:
然后,在程序退出的时候,这样释放空间的:
vector< CvPoint>().swap(PointVector);

-------------------------------------------
释放空间做什么?


里面存储的又不是指针!



VS2010 _MFC程序_内存泄露问题
不是vector 不会释放空间的么。。。。。
不是他会提前申请一大块空间,但是他不会自己释放的么。。。我还特意搜的释放方法。。。额 VS2010 _MFC程序_内存泄露问题

#13


引用 4 楼 zgl7903 的回复:
使用 DEBUG_NEW macro 这样new而没有delete的地方 在调试输出中会有明显的提示


为什么   我只是 运行, 在木有跑程序前,关掉 了这个 对话框 ,还会出现 内存泄露呢 VS2010 _MFC程序_内存泄露问题

vs2010 新建了一个 dlg ,
什么都没做,提示:

Detected memory leaks!
Dumping objects ->
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp(4500) : {270} client block at 0x002DCF90, subtype c0, 56 bytes long.
a CObject object at $002DCF90, 56 bytes long
c:\users\administrator.qqqpolimqc7hmgn.000\desktop\智驱\test\test\test.cpp(59) : {257} client block at 0x002DC758, subtype c0, 12 bytes long.
a CObject object at $002DC758, 12 bytes long
{256} client block at 0x002DC8F0, subtype c0, 204 bytes long.
a CObject object at $002DC8F0, 204 bytes long


VS2010 _MFC程序_内存泄露问题  很头疼啊。。。 下的 BoundsCheck 安装后,在 10 中也没显示出来。。郁闷哦 VS2010 _MFC程序_内存泄露问题

#14


http://blog.csdn.net/chenyujing1234/article/details/8075667

你看看这个

#15


按f4或者双击应该有反应的

#16


正解!
引用 5 楼 ydfivy 的回复:
{2425} normal block at 0x01E41138, 68 bytes long.

看见前面这个2425没有?
你多试几次。如果几次都有2425这样的块号,你就用_crtBreakAlloc函数设置这个块号。
然后再分配这个块号的地址时就会中断下来。你就知道是哪个东西分配的地址了。

#17


遇到同样问题,使用5楼的方法解决了。

#18


我也遇到这个问题。。。新建了个工程,加了检查内存的代码,直接就告诉我有内存泄露。看到任务管理器也确实在增加,这应该算是MFC的BUG吧。。什么都没动都有泄露。

#19


可能是opencv 库文件的问题吧,链接上就有内存泄漏了,楼主后来是怎么解决的?

#20