struct ItemData
{
LPTSTR* arrStrItem;
};在一个函数里面,我用
ItemData *pID;
pID = new ItemData;
.......
iList.AddTail(*pID);  
将分配的pID对象保存在一个CList <ItemData,ItemData&> iList;里面然后最后我要用下面的函数清除分配的空间
void CCallCenterView::ClearData()
{
POSITION pos = iList.GetHeadPosition();
if ( pos != NULL )
{
ItemData data; while ( pos != NULL )
{
ItemData *pID; data = (ItemData)iList.GetNext(pos); for ( int i = 0; i < 3; i++ )
{
delete[] data.arrStrItem[i];
}
delete[] data.arrStrItem;
                           pID = (ItemData*)&data;
                           delete pID;
//上面两句我是想用delete释放前面new分配的ItemData空间,可是却出现运行错误。但如果不把ItemData空间删除,用boundschecker检查出明显的内存资源泄漏。 }
}
iList.RemoveAll();
}

解决方案 »

  1.   

    使用指针:
    CList <ItemData*,ItemData*> iList
      

  2.   

    struct ItemData
    {
    // LPTSTR* arrStrItem;
    //用:
    CString strItem;
    };
      

  3.   

    乱七八糟的, 你对clist的理解不对,代码应该这样
    队列遍历当中这样处理
                               ItemData *pID; pID  = iList.GetNext(pos);
                               delete pID->arrStrItem;
                               delete pID;
    从CList当中获得出来的都是ItemData*类型, 你做强制转换成为ItemData类型是不对的
    先删除结构内部的指针,然后再次删除结构就可以了
      

  4.   

    delete [] pID->arrStrItem;
      

  5.   

    flyelf(空谷清音) ( ) : 
    好像应该是这样,我原来也是这么做的,但当时没想明白,认为pID是个局部变量,会存不到有用的值到iList里面。其实pID存的是ItemData的地址,ItemData没释放,iList里面的值就是有效的。不过当时是怎么搞不定记不清楚了。happy__888([顾问团]寻开心) :
    你没看清楚我写的,我用的是将ItemData存入CList的,所以我要想办法把ItemData也delete掉,我才用到delete (ItemData*)&data的
      

  6.   

    我没有说错
    列表当中放的是你定义的那个结构的指针,注意这里放的是指针,不是你的结构对象
    要删除列表,你要删除指针指向的结构当中的数据
    你的结构当中又包含了指针,所以要先释放结构当中的指针对象,
    然后再释放结构自身占据的空间,最后才是把指针从队列当中删除removeall
      

  7.   

    delete[] data.arrStrItem[i];是不是它有问题?
    delete[] data.arrStrItem;