使用双缓冲时,为什么在函数中定义了一个CBitmap对象,在结尾处一定要删除?该如何处理

使用双缓冲时,为什么在函数中定义了一个CBitmap对象,在结尾处一定要删除?
使用双缓冲时,比如说在OnPaint()函数中,有如下代码:
void CMyDlg::OnPaint()
{
  CPaintDC dc(this);
  CDC memoDC;
  CBitmap m_bitmap;
  memoDC.CreateCompatibleDC(&dc);
  m_bitmap.CreateCompatibleBitmap(&dc,...);
  ....
  ...
  memoDC.DeleteDC(); ///??????????????????
  m_bitmap.DeleteObject(); ///????????????????
}

就是对于函数中的最后两句我不太理解,定义的是局部对象,当函数退出时对象不就自动析构了吗?为什么一定要手动删除对象呢?
我看到的好多程序中好像都是手动删除的。

------解决方案--------------------
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,那是什么情况?
------解决方案--------------------
凡是派生自CGdiObject的类,如CPen,CBrush,对象析构时会自动调用Detach(),
不会造成内存泄漏。

所以在你这种情况DeleteObject是没有必要的,但是调用也不会出错。