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

Deleteing lists in C++ causes crash

本文关键字:崩溃 列表 C++ 删除      更新时间:2023-10-16

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

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

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

如果我只是打电话给m_pRescheduleReasons.clear(),它是首选吗

编辑:

指针在

列表中的存储方式如下:(我做了一个单独的项目来隔离问题:当第一次出现崩溃时调用删除时..但是指针也指向一个有效的对象?所以我不太确定为什么它会崩溃?

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; 
}

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

使用

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,从而泄漏。

老东西,我想你想要像 DeleteAll 宏这样的东西 Qt 中。

   bool deleteCSchSuggestBar(CSchSuggestBar *item)
   {
      delete item;
      return true;
   }
   m_pRescheduleReasons.remove_if(deleteCSchSuggestBar);
   m_pRescheduleReasons.clear();

您发布的代码

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

工作正常。我从中做了一个工作的例子。

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

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

m_pRescheduleReasons.clear();

这将导致列表为空。

如果我只调用 m_pRescheduleReasons.clear() 是首选吗?

这实际上归结为用例...

如果使用删除迭代器;调用,则只有迭代器将失效。但是如果你也想删除点,那么,删除 *iter 应该这样做。

考虑一下:

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

但是,假设在诸如主体-观察者模式之类的用例场景中,您需要维护观察者列表,随机删除观察者实际上并不是一个好的设计选择。