CList<LVITEM*, LVITEM*> listItems; 
POSITION listPos; 
LVITEM* pItem;POSITION pos = pDragList->GetFirstSelectedItemPosition();
while(pos)
{
     pItem = new LV_ITEM; //注意这行内存分配
     ZeroMemory(pItem, sizeof (LV_ITEM));   
     pItem->iItem = m_nDragIndex;
     pItem->mask = LVIF_TEXT;
     pItem->pszText = new char;  //注意这行内存分配
     pItem->cchTextMax = 255;     m_nDragIndex = pDragList->GetNextSelectedItem(pos);     pItem->iItem = m_nDragIndex; 
     pDragList->GetItem(pItem); 

     listItems.AddTail(pItem);
} listPos = listItems.GetHeadPosition();
while(listPos)
{
pItem = listItems.GetNext(listPos); 
m_nDropIndex = (m_nDropIndex == -1) ? pDropList->GetItemCount() : m_nDropIndex;
pItem->iItem = m_nDropIndex;
pDropList->InsertItem(pItem);  pDropList->SetItemState(pItem->iItem, LVIS_SELECTED, LVIS_SELECTED); 
         //为什么在使用完后不进行 delete pItem; 来进行内存释放呢?
m_nDropIndex++;
}由以上代码所知,作者在使用完new后未进行释放,从我的观点来看势必导致内存泄漏,但是我用2000下的任务管理器察看,发现内存并未随着程序的使用而逐渐增大,我不知道这段代码是否就是应该不释放内存还是2000有着清理内存泄漏的功能?
若是增加内存清除函数的话,程序中的两次new该怎样清楚掉?

解决方案 »

  1.   

    CList<LVITEM*, LVITEM*> listItems; listItems.AddTail(pItem); //PITEM由listItems这个链表管理, 应该是在程序的其它地方释放掉了.
      

  2.   

    我查过了,我所贴得代码是在一个函数里的,listItems是这个函数里的局部变量,程序中没有对listItems的操作的函数了。
      

  3.   

    pDropList->InsertItem(pItem);///在这里我认为: pDropList和ListItems都有一个元素指向pItem,所以只要pDropList释放就行了。 pDropList->SetItemState(pItem->iItem, LVIS_SELECTED, LVIS_SELECTED); 
    ---------------------------------------------------------------
             //为什么在使用完后不进行 delete pItem; 来进行内存释放呢?
    ---------------------------------------------------------------
    这里如果delete pItem,则造成pDropList有一个元素指向一个野指针pItem,
    所以我认为这里不能delete
      

  4.   

    pDropList->InsertItem(pItem); //应该是复制PITEM指向的内容,而不是仅仅保留PITEM这个指针.如果你认为可能泄漏内存, 你可以试着删除试试,如果程序运行出错, 说明在别的地方已经释放了.用这样的代码释放上述内存:
    delete pItem->pszText;
    delete pItem;
      

  5.   

    我认为有可能有内存泄露的地方在new  char 那里,可是这个内存能分配多大?
    运行1000次也不过几k,何况程序运行完毕之后也会清除。你用任务管理器查看能看出来我就服了you了,建议你换个专门查看内存泄露的工具!
      

  6.   

    我试过了,delete pItem; 程序运行也没有问题,但是delete pItem->pszText;就不行了
      

  7.   

    呵呵,我delete pItem后,程序退出时VC竟然报告发现内存泄漏。在pItem->pszText = new char;里。搞不懂。算了,看来老外写的程序是没有内存泄漏,不过我还是搞不懂。