3962|5

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

高手入,WinCE 内存泄露, 求助!!! [复制链接]

贴代码如下. CProgressCtrlEx.cpp类的功能是做一个进度条,替代系统自带的进度条. 在使用的过程中,发现存在内存泄露. 经过测试发现,泄露发生在当OnTimer()定时器进入时, 调用SetPos()函数,重新确定进度条的位置的时候, 需要刷新进度条, 调用Invalidate()函数. 查看系统使用内存时,发现内存不断增加, 频率是5-6秒钟,增加4KB.
    求助答案,站内回信,或Email lovefornothing@live.cn

#include "stdafx.h"
#include "resource.h"
#include "ProgressCtrlEx.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CProgressCtrlEx

CProgressCtrlEx::CProgressCtrlEx()
{
        m_nProgressPos=0;
        m_penframe.CreatePen(PS_SOLID,1,RGB(0,0,0));
}

CProgressCtrlEx::~CProgressCtrlEx()
{
        m_penframe.DeleteObject();
}


BEGIN_MESSAGE_MAP(CProgressCtrlEx, CWnd)
        //{{AFX_MSG_MAP(CProgressCtrlEx)
        ON_WM_ERASEBKGND()
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CProgressCtrlEx message handlers

bool CProgressCtrlEx::RegisterWindowClass()
{
    WNDCLASS wndcls;
    HINSTANCE hInst = AfxGetInstanceHandle();

    if (!(::GetClassInfo(hInst, ProgressCtrlEx_CLASSNAME, &wndcls)))
    {
        // otherwise we need to register a new class
        wndcls.style            = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
        wndcls.lpfnWndProc      = ::DefWindowProc;
        wndcls.cbClsExtra       = wndcls.cbWndExtra = 0;
        wndcls.hInstance        = hInst;
        wndcls.hIcon            = NULL;
        wndcls.hCursor          = NULL;
        wndcls.hbrBackground    = NULL;
        wndcls.lpszMenuName     = NULL;
        wndcls.lpszClassName    = ProgressCtrlEx_CLASSNAME;
        if (!AfxRegisterClass(&wndcls))
                                {
            AfxThrowResourceException();
            return FALSE;
        }
    }
        return TRUE;
}

bool CProgressCtrlEx::CreateCtrl(CWnd *pParent, CRect rcClient, UINT nID)
{
   if (!RegisterWindowClass())
                return FALSE;

        if (!Create(ProgressCtrlEx_CLASSNAME,NULL, WS_CHILD|WS_VISIBLE,CRect(rcClient.left,rcClient.top,rcClient.right,rcClient.bottom), pParent,nID,NULL))
                return FALSE;
        return TRUE;
}

BOOL CProgressCtrlEx::OnEraseBkgnd(CDC* pDC)
{
        // TODO: Add your message handler code here and/or call default
        CWnd::OnEraseBkgnd(pDC);
        CRect RectClient;
        GetClientRect(&RectClient);  
    pDC->FillSolidRect(RectClient,RGB(255,255,255));
        CRect rectframe;
        rectframe.left=RectClient.left+1;
        rectframe.top=RectClient.top+1;
        rectframe.right=RectClient.right-1;
        rectframe.bottom=RectClient.bottom-1;
        CPen* poldpen;
        poldpen=pDC->SelectObject(&m_penframe);
        pDC->MoveTo(rectframe.TopLeft());
        pDC->LineTo(CPoint(rectframe.right,rectframe.top));
        pDC->LineTo(CPoint(rectframe.right,rectframe.bottom));
        pDC->LineTo(CPoint(rectframe.left,rectframe.bottom));
        pDC->LineTo(CPoint(rectframe.left,rectframe.top));
    pDC->SelectObject(poldpen);
    CRect rectfill;
        rectfill.left=rectframe.left+1;
        rectfill.top=rectframe.top+1;
        rectfill.right=rectframe.right;
        rectfill.bottom=rectframe.bottom;
        if(m_nProgressPos!=100)
        {
                double temp1=m_nProgressPos*1.0;
                double temp2=temp1/100.0;
                int width=int(temp2*rectfill.Width());
                rectfill.right=rectfill.left+width;
        }
        else
        {
       rectfill.right=rectframe.right;
        }
   
        pDC->FillSolidRect(rectfill,RGB(220,40,30));
//        penframe.DeleteObject();
        return true;
}

void CProgressCtrlEx::SetPos(int nPos)
{
    m_nProgressPos=nPos;
        Invalidate();
}
此帖出自WindowsCE论坛

最新回复

如果开始运行的时候 是4K 4K慢慢增加,先不管它, 一般来说一个对象的建立和删除没有这么快,内存没有及时回收. 持续这样操作一段时间, 一两个小时后,还是一直增加就有问题了. 如果持续很长时间都是一直增加的问题就有问题.  详情 回复 发表于 2008-1-16 09:16
点赞 关注
 

回复
举报

60

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
代码里看不出内存泄露。。。
找找其他原因

如果是4K泄露的,一般认为是对象使用完毕没有释放造成的。例如CPen 用完后没有Delete掉
此帖出自WindowsCE论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
冰天雪地高空旋转720度直线下坠头朝下落地然后跪地裸求答复!!!
此帖出自WindowsCE论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

4
 
发过来看看吧...+ msn wince.net@hotmail.com
此帖出自WindowsCE论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 
冰天雪地高空旋转720度直线下坠头朝下落地然后跪地裸求答复!!!


--------------------
你有这能耐,厉害呀
此帖出自WindowsCE论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

6
 
如果开始运行的时候 是4K 4K慢慢增加,先不管它, 一般来说一个对象的建立和删除没有这么快,内存没有及时回收.
持续这样操作一段时间, 一两个小时后,还是一直增加就有问题了.
如果持续很长时间都是一直增加的问题就有问题.
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表