删除列表内容的正确方法是什么。目前我正在这样做。
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;
}
编辑:我解决了这个代表我的愚蠢错误
答案 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模式,你需要维护一个观察者列表,随机删除观察者并不是一个好的设计选择。