C++ 在C+中释放内存期间,迭代器与指针有何不同+;

C++ 在C+中释放内存期间,迭代器与指针有何不同+;,c++,dictionary,memory-management,iterator,c++98,C++,Dictionary,Memory Management,Iterator,C++98,我有一个类“DMRecSessionObj”,其对象使用new动态分配并存储在映射中 static std::map<string,DMRecSessionObj*> mapExpSessData; DMRecSessionObj* dmRecSessObj = new DMRecSessionObj(atoi(p_callNum),atoi(p_totCalls), sessionKey); mapExpSessData.insert(std::pair<string,DMR

我有一个类“DMRecSessionObj”,其对象使用new动态分配并存储在映射中

static std::map<string,DMRecSessionObj*> mapExpSessData;
DMRecSessionObj* dmRecSessObj = new DMRecSessionObj(atoi(p_callNum),atoi(p_totCalls), sessionKey);
mapExpSessData.insert(std::pair<string,DMRecSessionObj*>(sessionKey,dmRecSessObj));
但在尝试使用迭代器释放内存时,我有点困惑,如下所示:

std::map<std::string,DMRecSessionObj*>::iterator itr_del = mapExpSessData.find(tmp_sessionId);
if (itr_del != mapExpSessData.end()){
   mapExpSessData.erase(tmp_sessionId);
   delete itr_del->second;
}
std::map::迭代器itr\u del=mapExpSessData.find(tmp\u sessionId);
if(itr_del!=mapExpSessData.end()){
mapExpSessData.erase(tmp_sessionId);
删除itr_del->second;
}
在这种情况下,迭代器itr_del是否应该以某种方式设置为NULL?由于正常指针如果未设置为NULL,可能会导致指针悬空,因此在这种情况下迭代器的行为如何?在这种情况下,为了安全,还需要做些什么吗? 请建议


谢谢。

一旦您调用
mapExpSessData.erase(tmp\u sessionId)
,地图中指向的
itr\u del
节点已被删除。调用
delete itr\u del->second则是未定义的行为,因为您尝试访问解除分配的内存

您需要先删除地图中的值,然后删除地图中的节点:

delete itr_del->second;
mapExpSessData.erase(itr_del);

此时迭代器所在的代码块应该很小,迭代器本身超出了范围,因此您不需要对其进行任何操作来清除它。但是,如果您真的愿意,您可以将其类型的默认值重新分配给它。

迭代器本身不是指针,而是用于引用指针。为使此代码更安全,您可以添加的唯一额外内容是使
itr\u del->second=NULL有一个与您询问的问题不同的问题。必须在擦除之前执行删除操作,因为擦除操作会使迭代器无效。
delete itr_del->second;
mapExpSessData.erase(itr_del);