我正在尝试删除向量中的元素。这项工作到目前为止,但我无法释放已删除的内存。
我使用的代码:
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错误,因为我正在尝试访问已删除的对象。相反,我遇到了内存问题,因为我没有正确释放已删除对象的内存。它出了什么问题?
谢谢!
答案 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));