hur.cn - 华软网

 热门搜索

画刷会造成资源泄露???

  作者:未知    来源:网络    更新时间:2011/9/19

第一个函数,有人说,这种代码会造成资源泄露,为什么? 还是他说错了

HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
// HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here

// TODO: Return a different brush if the default is not desired



// return hbr;


   CBrush brush( RGB(252,100,0));
   
   CRect rect;

   GetClientRect(rect);

   pDC->SelectObject(&brush);

   pDC->FillRect( rect, &brush);

   return brush;



}


第二个函数中的if {}  这小块代码 ,  一直没有深究, 今天有人问道这个问题,我

设置了断点,死活进步了if块  ,不是else  ,是if

if 字面意思是:  最小化的时候,也就是说 程序只有在任务栏, 才响应



void CTestDlg::OnPaint() 
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}



---华软 网友回答---
顺便问个c++语法问题, 按道理来说,  只要是公有成员, 子类都可以继承到父类的啊


比如CSatic类 ,是继承CWnd类,CWnd提供了个Create函数,

CStatic类然后重载了这个函数, 尽管重载了,但是它还是可以调用继承的Create函数吧??


我发现, vc都不会提示,有Cwnd的Create这个函数???


---华软网友回复---
up  up
---华软网友回复---
第一个函数,确实容易造成资源泄露,
这个 CBrush 你没有释放吧,首先不能在函数内部释放,因为你要返回这个画刷。也不能在析构函数中释放,因为这个是局部变量。

应该把 CBrush brush 定义为成员变量,并在构造函数中初始化,在析构函数中使用DeleteObject释放brush
---华软网友回复---
第一个:对于已经选进设备上下文的资源,不能直接删除,所以你最好:
 CBrush brush( RGB(252,100,0));
    
  CRect rect;

  GetClientRect(rect);
 
  CBrush *oldBrush=pDC->SelectObject(&brush);

  pDC->FillRect( rect, &brush);

  pDC->SelectObject(oldBrush);

  return brush;
---华软网友回复---
平凡兄一点拨, 我就明白了,,,


据说 资源这东西是在内存中, 资源泄露原因是没有释放,  操作系统部在内存很充裕的时候,都可能造成:

资源没有创建, 所以要及时 释放掉!1


 第二个问题, 可以解答一下吗


引用 3 楼 chinatcp 的回复:
第一个函数,确实容易造成资源泄露,
这个 CBrush 你没有释放吧,首先不能在函数内部释放,因为你要返回这个画刷。也不能在析构函数中释放,因为这个是局部变量。

应该把 CBrush brush 定义为成员变量,并在构造函数中初始化,在析构函数中使用DeleteObject释放brush

---华软网友回复---
我又有个疑问

OnCtrlColor这个函数, 在对话框没哟销毁的前提上,会不会被多次调用??

如果被多次调用??

我认为,应该在OnInitDialog里面SelectObject工作也做了  ,光在构造函数中 ,对 CBrush进行初始化,不够!!





引用 3 楼 chinatcp 的回复:
第一个函数,确实容易造成资源泄露,
这个 CBrush 你没有释放吧,首先不能在函数内部释放,因为你要返回这个画刷。也不能在析构函数中释放,因为这个是局部变量。

应该把 CBrush brush 定义为成员变量,并在构造函数中初始化,在析构函数中使用DeleteObject释放brush

---华软网友回复---
这样就可以  SelectObject一次,   析构函数中 DeleteObject -----一次


引用 6 楼 xaojin2011 的回复:
我又有个疑问

OnCtrlColor这个函数, 在对话框没哟销毁的前提上,会不会被多次调用??

如果被多次调用??

我认为,应该在OnInitDialog里面SelectObject工作也做了  ,光在构造函数中 ,对 CBrush进行初始化,不够!!





引用 3 楼 chinatcp 的回复:

第一个函数,确实容易造成资源泄露,
这个 CBrus……

---华软网友回复---
第二个函数,
IsIconic(),该函数确定给定窗口是否是最小化。
IsIconic()的作用是当窗口处于最小化状态时进行图标的绘制操作。
但是实际上在窗口最小化,一般来说是不会进行窗口的重绘,也就是不会触发WM_PAINT消息。
---华软网友回复---
楼主的精神值得敬佩!好好研究!
---华软网友回复---
第二个函数中的if {} 这小块代码 , 一直没有深究, 今天有人问道这个问题,我

设置了断点,死活进步了if块 ,不是else ,是if

if 字面意思是: 最小化的时候,也就是说 程序只有在任务栏, 才响应
----------------
你最小化窗口试试~
---华软网友回复---
ReleaseDC      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。