C++ 悬空内存/未分配内存问题

C++ 悬空内存/未分配内存问题,c++,pointers,memory,memory-management,C++,Pointers,Memory,Memory Management,我有一段代码,它由计时器更新机制调用 但是,我注意到,应用程序在运行时的内存大小不断增加4,这表明可能存在恶意指针或其他问题 void RtdbConnection::getItemList() { std::vector<CString> tagList = mItemList->getItems(); //CString str(_T("STD-DOL1")); PwItemList* pil = mPwSrv->GetItemList(); CPwItem pw

我有一段代码,它由计时器更新机制调用

但是,我注意到,应用程序在运行时的内存大小不断增加4,这表明可能存在恶意指针或其他问题

void RtdbConnection::getItemList()
{

std::vector<CString> tagList = mItemList->getItems();
//CString str(_T("STD-DOL1"));
PwItemList* pil = mPwSrv->GetItemList();
CPwItem pw ;

for(auto it = tagList.begin(); it != tagList.end(); ++it)
{

    pw = mPwSrv->GetItem(*it);
    pil->AddItem(&(PwItem)pw);

}

pil->AddInfo(DB_DESC);  //Description
pil->AddInfo(DB_QALRM); // Alarm Status
pil->AddInfo(DB_QUNAK); //UNACK status
pil->AddInfo(DB_AL_PRI); // Priority of the alarm tag

pil->ExecuteQuery();


int i = 0;

for (auto it = tagList.begin();  i < pil->GetInfoRetrievedCount() && it != tagList.end(); i+=4, it++) 
{       
    //item = {0};
    CString str(*it);
    PwInfo info = pil->GetInfo(i);
    CString p(info.szValue().c_str());
    bool isAlarm = pil->GetInfo(i+1).bValue();
    bool isAck = pil->GetInfo(i+2).bValue();
    int priority  = pil->GetInfo(i+3).iValue();

    item = ItemInfo(str, p, isAlarm, isAck, priority);
    //int r = sizeof(item);
    mItemList->setInfo(str, item);   // Set the details for the item of the List


}

delete pil;
pil = NULL;


}
定义为:

    void ItemList::setInfo(CString tagname, ItemInfo info)
{
    int flag = 0;
    COLORREF tempColour;
    std::map<CString, ItemInfo>::iterator tempIterator;
    if ( (tempIterator = mAlarmListMap.find(tagname)) !=mAlarmListMap.end() )
    {
        //remove the current iteminfo and insert new one
        if(mAlarmListMap[tagname].getPriority() != info.getPriority() && (mAlarmListMap[tagname].getPriority()!=0))
        {
            mAlarmListMap[tagname].updatePriority(info.getPriority());
            mAlarmListMap[tagname].mPrioChanged = TRUE;
        }
        else
        {
            mAlarmListMap[tagname].mPrioChanged = FALSE;
            ((mAlarmListMap[tagname].getPrevPriority() != 0)?(mAlarmListMap[tagname].ResetPrevPriority()):TRUE);
            mAlarmListMap[tagname].setPriority(info.getPriority());
        }


        mAlarmListMap[tagname].setDescription(info.getDescription());
        mAlarmListMap[tagname].setAlarm(info.getAlarmStat());
        mAlarmListMap[tagname].setAlarmAck(info.getAckStat());
        tempColour = mColourLogic->setUpdatedColour(mAlarmListMap[tagname].getAlarmStat(), mAlarmListMap[tagname].getAckStat(), flag);
        mAlarmListMap[tagname].setColour(tempColour);

        if(!(info.getAlarmStat() || info.getAckStat()))
        {

                flag = 1;
                mAlarmListMap[tagname].mIsRTN = true;
                mAlarmListMap[tagname].setDisplayCondition(false);

        }
        else
        {
            mAlarmListMap[tagname].setDisplayCondition(true);
        }

                //((mAlarmListMap[tagname].mIsRTN == true)?

    }
    else
       { 
           tempIterator =  mAlarmListMap.begin();
           tempColour = mColourLogic->fillColourFirst(info.getAlarmStat(), info.getAckStat());
           info.setColour(tempColour);
           mAlarmListMap.insert(tempIterator, std::pair<CString,ItemInfo>(tagname,info));

    }



}
void ItemList::setInfo(CString标记名,ItemInfo)
{
int标志=0;
颜色;颜色;
std::map::迭代器tempierator;
如果((tempIterator=mAlarmListMap.find(标记名))!=mAlarmListMap.end())
{
//删除当前iteminfo并插入新的iteminfo
如果(mAlarmListMap[tagname].getPriority()!=info.getPriority()&&(mAlarmListMap[tagname].getPriority()!=0))
{
mAlarmListMap[tagname].updatePriority(info.getPriority());
mAlarmListMap[tagname].mPrioChanged=TRUE;
}
其他的
{
mAlarmListMap[tagname].mPrioChanged=FALSE;
((mAlarmListMap[tagname].getPrevPriority()!=0)?(mAlarmListMap[tagname].ResetPrevPriority()):真);
mAlarmListMap[tagname].setPriority(info.getPriority());
}
mAlarmListMap[tagname].setDescription(info.getDescription());
mAlarmListMap[tagname].setAlarm(info.getAlarmStat());
mAlarmListMap[tagname].setAlarmAck(info.getAckStat());
TempColor=mColourLogic->SetupDatedColor(mAlarmListMap[tagname].getAlarmStat(),mAlarmListMap[tagname].getAckStat(),标志);
mAlarmListMap[tagname].SetColor(TempColor);
if(!(info.getAlarmStat()| | info.getAckStat()))
{
flag=1;
mAlarmListMap[tagname].mIsRTN=true;
mAlarmListMap[标记名].setDisplayCondition(假);
}
其他的
{
mAlarmListMap[标记名].setDisplayCondition(真);
}
//((mAlarmListMap[tagname].mIsRTN==true)?
}
其他的
{ 
tempIterator=mAlarmListMap.begin();
tempColour=mColourLogic->fillcolorFirst(info.getAlarmStat(),info.getAckStat());
信息设置颜色(tempColour);
插入(临时迭代器,std::pair(标记名,信息));
}
}
我试着处理分配问题,但增加的幅度总是恒定的

任何人都可以看看并强调问题所在吗?
非常感谢。

这会有什么不同?我该怎么做才能修复它?尝试更改。不起作用。内存仍然增加。使用符号编译并使用内存检查器运行程序,例如Valgrind()调试内存问题。但从表面上看,有人能注意到任何恶意的内存分配,而这些内存分配没有被取消吗?正如您提到的由其他函数调用的代码,您确定泄漏来自所显示的代码吗?
    void ItemList::setInfo(CString tagname, ItemInfo info)
{
    int flag = 0;
    COLORREF tempColour;
    std::map<CString, ItemInfo>::iterator tempIterator;
    if ( (tempIterator = mAlarmListMap.find(tagname)) !=mAlarmListMap.end() )
    {
        //remove the current iteminfo and insert new one
        if(mAlarmListMap[tagname].getPriority() != info.getPriority() && (mAlarmListMap[tagname].getPriority()!=0))
        {
            mAlarmListMap[tagname].updatePriority(info.getPriority());
            mAlarmListMap[tagname].mPrioChanged = TRUE;
        }
        else
        {
            mAlarmListMap[tagname].mPrioChanged = FALSE;
            ((mAlarmListMap[tagname].getPrevPriority() != 0)?(mAlarmListMap[tagname].ResetPrevPriority()):TRUE);
            mAlarmListMap[tagname].setPriority(info.getPriority());
        }


        mAlarmListMap[tagname].setDescription(info.getDescription());
        mAlarmListMap[tagname].setAlarm(info.getAlarmStat());
        mAlarmListMap[tagname].setAlarmAck(info.getAckStat());
        tempColour = mColourLogic->setUpdatedColour(mAlarmListMap[tagname].getAlarmStat(), mAlarmListMap[tagname].getAckStat(), flag);
        mAlarmListMap[tagname].setColour(tempColour);

        if(!(info.getAlarmStat() || info.getAckStat()))
        {

                flag = 1;
                mAlarmListMap[tagname].mIsRTN = true;
                mAlarmListMap[tagname].setDisplayCondition(false);

        }
        else
        {
            mAlarmListMap[tagname].setDisplayCondition(true);
        }

                //((mAlarmListMap[tagname].mIsRTN == true)?

    }
    else
       { 
           tempIterator =  mAlarmListMap.begin();
           tempColour = mColourLogic->fillColourFirst(info.getAlarmStat(), info.getAckStat());
           info.setColour(tempColour);
           mAlarmListMap.insert(tempIterator, std::pair<CString,ItemInfo>(tagname,info));

    }



}