这是一个列表控件初始化程序的一部分
void CNewCrtlDlg::InitlistCrtl()
{
     //沙漏光标
CWaitCursor cursor;
//清除列表控件中所有内容
If(m_ListFile.GetItemCount()!=0)
{    m_listfile.DeleteAllItems();
}
//是否有目录被选中
CString szCurPath=GetCurPath();
if(szCurPath.IsEmpty())
return;
//创健大小图像列表
CImageList* pSmallImageList=new cImageList;
CImagelist* pLargeImageList=new CImageList;
CBitmap bitmap;
pSmallImageList->Create(12,12,lLC_COLOR,2,0);
bitmap.LoadBitmap(IDB_DIRS);
pSmallImageList->ADD(&bitmap,(COLORREF)0x000001);
bitmap.DeleteObject();
bitmap.LoadBitmap(IDB_FILES);
pSmallImageList->ADD(&bitmap,(COLORREF)0x000001);
bitmap.DeleteObject();
pLargeImageList->Create(32,32,ILC_COLOR,2,0);
bitmap.LoadBitmap(IDB_DIRB);
pLargeImageList->ADD(&bitmap,(COLORREF)0x000001);
bitmap.DeleteObject();
bitmapLoadBitmap(IDB_FILEB);
pLargeImageList->ADD(&bitmap,(COLORREF)0x000001);
bitmap.DeleteObject();//
CImageList* pOldSmallImageList;
pOldSmallImagelist=m_listFile.SetImageList(pSmallImageList,LVSIL_SMALL);
IF(pOldSmallImageList!=NULL)
delete pOldSmallImageList;
cImageList* pOldLargeImageList;
poldLargeImagelist=m_listfile.SetimageList(pLargeImagelist,LVSIL_NORMAL);
IF(pOldLargeImageList!=NULL)
delete pOldLargeImageList;
…………………………
……
……

1.为什么delete pOldLargeImageList;delete pOldSmallImageList;而不是删除pSmallImageList、pLargeImageList
2.为什么bitmap.LoadBitmap(IDB_FILES);还要对其bitmap.DeleteObject(); 而CWaitCursor cursor不用去删除

解决方案 »

  1.   

    1.delete pSmallImageList、delete pLargeImageList一样的,效果,
    2.bitmap.DeleteObject(); 可加可不加,自动清除的,因为是局部的
      

  2.   

    如现在删除pSmallImageList那你的m_listfile中不就出错了吗?等m_listfile析构时会删除的(或你自己写代码删除)
    Bitmap封装了内核对象(就是带有HANDLE的对象)内核对象不可以象指针一样操作。必须用CloseHandle等去操作,估计DeleteObject应该是一个GDIObject的一个抽象函数专门对各种GDIObject来封装删除Handle的操作。
    另外内核对象是Windows中和操作系统安全直接相关的内存块(数据结构)所以为保证安全Window不使用指针而提供了一套函数来操作它们。
    比如HDC等都是内核对象。
      

  3.   

    to opentuxedo(开缝的燕尾服) 
    pOldImagelist是什么,为什么要删除它呢?
      

  4.   

    CWaitCursor cursor因为是就地建立对象,所以系统可以识别其工作范围,以结束时自然可以delete,而bitmap.LoadBitmap(IDB_FILES);相当于new了一个IDB_FILES,系统无法确定其工作范围,所以不进行自动delete所以需要人为进行delete,bitmap.DeleteObject(); 就相当于在其过程中进行delete
      

  5.   

    to to opentuxedo(开缝的燕尾服) 
    Bitmap封装了内核对象,就是说它不能被像delete这种简单地删除吗
      

  6.   

    为什么delete pOldLargeImageList,而不是删除pLargeImageList.
    pLargeImageList用的是new操作符,而pOldLargeImageList不是,却delete pOldLargeImageList
    不明白