从指针向量中删除元素

时间:2014-05-21 11:20:19

标签: c++ memory-management memory-leaks

我正在尝试删除向量中的元素。这项工作到目前为止,但我无法释放已删除的内存。

我使用的代码:

vector<TJet*> *tlv_jets;
//...Filling tlv_jets...
for (vector<TJet*>::iterator it = tlv_jets->begin(); it != tlv_jets->end();/*it++*/)
    {
    if (TMath::Abs((*it)->Rapidity()) > ycut)
        {
        cout<< "================" << endl;
        cout<< (*it)->Rapidity() << endl; //Check before deleting
        delete *it;                       //free memory
        cout<< (*it)->Rapidity() << endl; //Check after deleting
        it = tlv_jets->erase(it);         //remove from vector

     }
    else
        ++it;
     }

if中只是选择要删除的元素。 两个couts都返回相同的值,但我想要一个seg错误,因为我正在尝试访问已删除的对象。相反,我遇到了内存问题,因为我没有正确释放已删除对象的内存。它出了什么问题?

谢谢!

3 个答案:

答案 0 :(得分:1)

访问已删除的对象是未定义的行为。没有 保证段错误或其他任何东西。 delete *it 应该正确释放内存,但是未定义 行为,所有赌注都关闭。 (TJet::Rapidity做了什么 例。在被破坏的物体上调用它可能会导致 例如,自由空间舞台的腐败。)

删除第二张支票后,您是否还有问题?

另外,它的价值(但我不担心):

delete *it也是正式未定义的行为,因为它 导致向量中的不可复制对象。正式的 课程。在实践中,它的副本非常非常罕见 删除指针实际导致任何问题,即使它 没有,矢量的实现实际上不会复制已删除的 指针,因为它将被擦除覆盖(没有 首先被复制)。

答案 1 :(得分:0)

这取决于TJet :: Rapidity的内容。如果此方法中没有对TJet成员进行任何处理,那么就不会出错。

答案 2 :(得分:0)

作为补充答案,如果您的编译器支持C ++ 11,您可以在一行中执行此操作:

tlv_jets->erase(std::remove_if(std::begin(*tlv_jets),
                              std::end(  *tlv_jets), 
                              [&] (TJet* e) {
                                if(TMath::Abs(e->Rapidity()) > ycut) {
                                  delete e;
                                  return true;
                                }
                                return false;
                              }), std::end(tlv_jets));