使用双缓冲时,比如说在OnPaint()函数中,有如下代码:
void CMyDlg::OnPaint()
{
  CPaintDC dc(this);
  CDC memoDC;
  CBitmap m_bitmap;
  memoDC.CreateCompatibleDC(&dc);
  m_bitmap.CreateCompatibleBitmap(&dc,...);
  ....
  ...
  memoDC.DeleteDC();                 ///??????????????????
  m_bitmap.DeleteObject();           ///????????????????
}就是对于函数中的最后两句我不太理解,定义的是局部对象,当函数退出时对象不就自动析构了吗?为什么一定要手动删除对象呢?
我看到的好多程序中好像都是手动删除的。

解决方案 »

  1.   

    memoDC.DeleteDC();                 
      m_bitmap.DeleteObject();这两句不是删除对象,是删除对象包含的资源
      

  2.   

    CGdiObject::DeleteObject 
    BOOL DeleteObject( );Return ValueNonzero if the GDI object was successfully deleted; otherwise 0.ResDeletes the attached Windows GDI object from memory by freeing all system storage associated with the Windows GDI object. The storage associated with the CGdiObject object is not affected by this call. An application should not call DeleteObject on a CGdiObject object that is currently selected into a device context. When a pattern brush is deleted, the bitmap associated with the brush is not deleted. The bitmap must be deleted independently.
      

  3.   

     memoDC.DeleteDC(); 
    这句是释放memoDC对象的DC句柄(HDC);
     m_bitmap.DeleteObject();
    这句是释放m_bitmap对象的BITMAP句柄(HBITMAP); 而句柄的实质是指针。memoDC.DeleteDC();
    m_bitmap.DeleteObject();
    这两句就相当于释放给指针成员分配的空间之所以没有将这些功能内化到~CDC()中,是因为有些情况HDC是Attach得到的,Detach之后HDC还可以用。想一下,有可能一个HDC多个CDC变量都要用到,因为一个变量的析构而释放了HDC,那是什么情况?
      

  4.   

    那就是说我在函数中如果定义了一个GDI对象,比如说CPen,CBrush,CFont等,在函数退出之前最好都delete掉?
      

  5.   

    凡是派生自CGdiObject的类,如CPen,CBrush,对象析构时会自动调用Detach(),
    不会造成内存泄漏。所以在你这种情况DeleteObject是没有必要的,但是调用也不会出错。
      

  6.   

    之所以没有将这些功能内化到~CDC()中,是因为有些情况HDC是Attach得到的,Detach之后HDC还可以用。 
    -----------------------------------------------
    对不起,这个说错了。
    Detach之后CDC对象的HDC被赋值为HNULL如果你不释放~CDC()也会释放,只不过内存回收不如直接释放来得快(这在VC中比较明显,析构后对象的所占的内存在一段时间内仍不会回收)