删除 C++ 中的列表会导致崩溃
Deleteing lists in C++ causes crash
删除列表内容的正确方法是什么。 目前我正在这样做。
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 应该这样做。
考虑一下:
如果您拥有该列表中的对象,那么删除这些对象将是一个有效的用例。
但是,假设在诸如主体-观察者模式之类的用例场景中,您需要维护观察者列表,随机删除观察者实际上并不是一个好的设计选择。
- 当回溯以零开始时,如何调试崩溃
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 如何在C / C++中正确实现链接列表而不会使程序崩溃
- C 链接列表堆栈POP功能崩溃
- 我很难弄清楚为什么我的双重链接列表会崩溃,我可以找到一些方向
- 将元素添加到列表会使程序崩溃..有时
- C++初始化复制构造函数中的列表赋值,并在复制构造函数中崩溃
- 带有圆形链接列表的崩溃
- 删除 C++ 中的列表会导致崩溃
- 每次我在SFML中绘制列表项时,它都会崩溃
- Qt 当列表小部件项被单击两次时崩溃
- 复制列表时光荣崩溃
- 使用"pop_front"从排序列表中删除元素会导致崩溃
- C++STL列表崩溃,数字超过1000 000 000 000
- 当列表中有两个以上的项目时,链表的函数 add 会崩溃
- 应用程序在OpenCV的均衡化列表上崩溃
- 当添加一个指针到多个boost::ptr_vector列表时崩溃
- 删除循环列表中的节点时崩溃
- 复制链接列表会使程序崩溃
- 排序算法在试图打印列表信息时崩溃