删除地图中的矢量指针对象元素

时间:2016-12-13 19:40:47

标签: c++

我有一个包含字符串和指针对象矢量的地图。当我尝试删除向量中的对象时,它似乎工作但当我列出另一个函数中的所有向量对象时,程序在遇到已删除的对象位置时崩溃/中止。我相信我已经搞砸了删除对象,指针指向NULL,这就是为什么会发生这种情况但我现在真的不知道。

//map is: map<string, vector<baseObject *>>

vector<Message*>::iterator v_itr;
vector<baseObject*> & vec = itr->second;
    for (v_itr = vec.begin(); v_itr != vec.end(); v_itr++){

    firstDerivedObj * p_first = dynamic_cast<TextMessage*>(*v_itr);
    secondDerivedObj * p_second = dynamic_cast<VoiceMessage*>(*v_itr);

    if (p_first){
        delete p_first;
    }
    if (p_second){ delete p_second; }
}

代码看起来像没有错误地删除但是当我运行另一个函数来显示地图中的所有向量时程序崩溃。

1 个答案:

答案 0 :(得分:0)

在我看来,在从特定向量元素指向的内存中删除对象后,该元素仍然指向该内存位置,这会导致您的错误。我建议您也需要从矢量中删除该位置。这样的事情应该有效:

vector<Message*>::iterator v_itr;
vector<baseObject*> & vec = itr->second;
for (v_itr = vec.begin(); v_itr != vec.end(); v_itr++){    
     firstDerivedObj * p_first = dynamic_cast<TextMessage*>(*v_itr);
     secondDerivedObj * p_second = dynamic_cast<VoiceMessage*>(*v_itr);
     if(p_first || p_second){
         if (p_first){
             delete p_first;
         }
         if (p_second){ 
             delete p_second; 
         }
         vec.erase(v_itr);
         break;
     }
 }