删除C ++中的列表会导致崩溃

时间:2015-01-23 09:47:57

标签: c++ list crash

删除列表内容的正确方法是什么。目前我正在这样做。

std::list<CSchSuggestBar*>::const_iterator iter = m_pRescheduleReasons.begin();
for (; iter != m_pRescheduleReasons.end(); ++iter)
{
    delete *iter;
}

但是删除* iter似乎会导致崩溃。

如果我只是致电m_pRescheduleReasons.clear()

,是否首选

编辑:

如何将指针存储在列表中的方式如下:(我做了一个单独的项目来隔离问题:当第一次出现崩溃时调用delete时..但是有一个有效的对象,其中指针指点太过了?所以我不太清楚为什么它会崩溃?

std::vector<Foo*> f;
for(int i = 0; i < 10; i++)
{
  f.push_back(f1);
}
 std::vector<Foo*>::const_iterator it = f.begin();
for (; it != f.end(); ++it)
{
   delete *it; 
}

编辑:我解决了这个代表我的愚蠢错误

4 个答案:

答案 0 :(得分:2)

使用

std::list<std::unique_ptr<SomeType>> mylist;

它会自动删除list::clear()list::~list()的内容。由于无法复制unique_ptr,因此您必须移动它们

mylist.push_back(std::move(std::unique_ptr<SomeType>(new SomeType(args))));
mylist.push_back(std::move(make_unique(new SomeType(args))); // C++14

您也可以在

中使用list::emplace
mylist.emplace_back(new SomeType(args));

但如果节点分配失败,new SomeType(args)分配的内存将不会分配给unique_ptr,从而泄漏。

答案 1 :(得分:0)

旧的,我认为你想在Qt中使用deleteAll宏。

   bool deleteCSchSuggestBar(CSchSuggestBar *item)
   {
      delete item;
      return true;
   }

   m_pRescheduleReasons.remove_if(deleteCSchSuggestBar);
   m_pRescheduleReasons.clear();

答案 2 :(得分:0)

您发布的代码

std::list<CSchSuggestBar*>::const_iterator iter = m_pRescheduleReasons.begin();
for (; iter != m_pRescheduleReasons.end(); ++iter)
{
    delete *iter;
}

工作正常。我从中做了working example

崩溃可能是由析构函数调用本身引起的。

或者,在您的情况下更有可能:您在悬空指针(已经销毁的旧对象的地址)上调用delete。在销毁循环中的所有对象后尝试添加此行:

m_pRescheduleReasons.clear();

这会产生一个空列表。

答案 3 :(得分:-1)

我只是打电话给m_pRescheduleReasons.clear()

这真的归结为用例...

如果你使用删除它;调用,只是迭代器将被无效....但如果你也想删除指针,那么,删除* iter应该这样做。

考虑一下:

如果您拥有该列表中的对象,那么删除这些对象将是一个有效的用例。

但是在一个用例场景中,例如Subject-observer模式,你需要维护一个观察者列表,随机删除观察者并不是一个好的设计选择。