我的程序是监控图形曲线程序,从串口不断收取数据并将这些数据绘画成曲线,开始两、三个小时不见有问题但过后的5小时后就出现如题的情况,VIEW里的中文文字变成了乱码,图形不再刷新,TOOLTIP背景色变成了白色而且不自动消失。1 请问这是不是GDI资源泄漏??
2 用BC检测时提示了泄漏,但如何得知是发生在哪行代码??
3 我已检查了几篇绘图部份的代码觉得该DELETE的OBJECT都DELETE了,请问这类型泄漏还有哪些常见的情况??
4 请问内存照片是否也可以检测出GDI泄漏??如何做??谢谢了!!!
2 用BC检测时提示了泄漏,但如何得知是发生在哪行代码??
3 我已检查了几篇绘图部份的代码觉得该DELETE的OBJECT都DELETE了,请问这类型泄漏还有哪些常见的情况??
4 请问内存照片是否也可以检测出GDI泄漏??如何做??谢谢了!!!
另外,你在绘图中是否有在循环中申请资源的操作,这也会导致资源耗尽。
如果有,则必须用ReleaseDC()释放资源。比如:void Draw()
{
CDC* pDC = GetDC();
......
ReleaseDC( pDC );
}
dc是耗费内存很大,估计很快内存就耗光了
不容易注意到的是HBRUSH如果有创建而不释放的话也容易造成这种情况另外一种情况是释放不成功
SelectObject后由于没有选回原来的gdi对象造成dc占有资源而无法释放
建议写法规范话,选择资源(SelectObject)后,
使用完一定要选回再释放选入的gdi对象
happyparrot(快乐鹦鹉): 好像DEBUG里只能看NEW/DELETE的泄漏,而GDI的泄漏却看不到的。dhbo(每天进步1%) : 是的,在TIMER中有申请了GDI,因为是实时的绘图,所以绘图函数是在TIMER里做的,但只要这些函数及时释放资源不是可以了吗?问题是有没有在哪里隐蔽地申请了但自己又不知道释放?LendyZhang(Lendy) :在我的代码里没有用到GetDC()函数,在搜索旧贴里我也得知这个函数是会申请资源的,不过我用了GetSafeDC()不知这个是否会有影响?
用完资源后应该立即DeleteObject();
在WIN2000以下操作系统上使用资源后不释放会有内存泄漏。楼主检查一下所有使用GDI资源的地方,把没有释放的资源都释放掉。
在Task Manager里面,切换到Processes,把Gdi Objects这列显示出来,看看你的程序GDI对象的数目是不是越来越高。