C++ 悬空内存/未分配内存问题
我有一段代码,它由计时器更新机制调用 但是,我注意到,应用程序在运行时的内存大小不断增加4,这表明可能存在恶意指针或其他问题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
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));
}
}