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

C++ 删除地图中的矢量指针对象元素,c++,C++,我有一个包含字符串和指向指针对象的向量的映射。当我试图删除向量中的一个对象时,它似乎起作用,但当我在另一个函数中列出所有向量对象时,程序在命中已删除对象位置时崩溃/中止。我相信我把删除对象搞砸了,指针指向NULL,这就是为什么会发生这种情况,但我现在真的不知道 //map is: map<string, vector<baseObject *>> vector<Message*>::iterator v_itr; vector<baseObject*&

我有一个包含字符串和指向指针对象的向量的映射。当我试图删除向量中的一个对象时,它似乎起作用,但当我在另一个函数中列出所有向量对象时,程序在命中已删除对象位置时崩溃/中止。我相信我把删除对象搞砸了,指针指向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; }
}
//映射为:映射
向量::迭代器v_itr;
向量&vec=itr->second;
对于(v_itr=vec.begin();v_itr!=vec.end();v_itr++){
firstDerivedObj*p_first=动态投射(*v_itr);
secondDerivedObj*p_second=动态投射(*v_itr);
如果(p_优先){
首先删除p_;
}
如果(p_秒){删除p_秒;}
}

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

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

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;
     }
 }
vector::迭代器v_itr;
向量&vec=itr->second;
对于(v_itr=vec.begin();v_itr!=vec.end();v_itr++){
firstDerivedObj*p_first=动态投射(*v_itr);
secondDerivedObj*p_second=动态投射(*v_itr);
if(p|u优先| p|u第二){
如果(p_优先){
首先删除p_;
}
如果(p_秒){
删除p_秒;
}
矢量擦除(v_itr);
打破
}
}

阅读有关。尤其要密切关注它的回报。使用它需要对循环进行一些重构。
delete
只删除指针指向的内存。它对向量没有任何作用。除了非常短暂的操作外,不要将原始指针存储在向量中。请编辑您的问题,使其包含a。必须使用
dynamic\u cast
进行运行时类型检查通常是一个糟糕设计的标志。哇,非常感谢它的工作!我对这件事非常恼火,因为我有一个删除声明,而不是休息。如果没有中断,函数将中止/崩溃。为什么需要休息?我不在其他if语句中使用它,它们结束时没有错误。缩短循环。擦除会将迭代器更改为下一个元素,循环就会出错。