连续使用 std::list 会导致崩溃
Consecutive use of std::list causes crash
我有用于内存管理的代码,但它在某个时候不断崩溃,我从"活动"列表中删除一个对象并将其放在"死"列表中:
class MemoryObject {
private:
static std::list <MemoryObject *> alive, dead;
long references;
public:
MemoryObject() {
alive.push_back(this);
references = 0;
}
static void deepClean() {
clean();
std::list<MemoryObject *>::iterator iterator;
for(iterator = alive.begin(); iterator != alive.end(); iterator ++) {
MemoryObject *object = *iterator;
Log::instance().write(DEBUG_LOG, "nObject still active at the end of the program, check for memory leaks."
"nSize: %d",
alive.size());
delete object;
}
alive.clear();
}
void reference() {
references ++;
}
void release() {
references --;
if(references <= 0) {
dead.push_back(this);
alive.remove(this);
}
}
static void clean() {
std::list<MemoryObject *>::iterator iterator;
for(iterator = dead.begin(); iterator != dead.end(); iterator ++)
delete(&iterator);
dead.clear();
}
~MemoryObject() {
clean();
}
};
std::list <MemoryObject *> MemoryObject::alive, MemoryObject::dead;
Eclipse 调试显示它在 release(( 下失败,总是在第二个与列表相关的位置 - 我尝试将它们 (alive.remove(this) and dead.push_back(this)
( 按不同的顺序放置,这没有任何变化。然而有趣的是,如果我在它们之间放置一些东西,比如 printf(( 语句,它不会崩溃......
这是我调用它的地方:
#include <stdlib.h>
#include <stdio.h>
#include "log/log.hpp"
#include "memory/object.hpp"
int main(int argc, char *argv[]) {
MemoryObject foo;
foo.release();
MemoryObject::deepClean();
return 0;
}
在clean
函数中,您有:
delete(&iterator);
这将编译,但会尝试删除迭代器本身 - 它在堆栈上(会崩溃(。
我怀疑你想要:
delete(*iterator);
不能删除未分配 new 的对象。MemoryObject foo;
不会分配新的。
您只delete
通过new
分配的内容。
MemoryObject foo;
foo.release();
而且里面干净
for(iterator = dead.begin(); iterator != dead.end(); iterator ++)
delete(*iterator); //I am assuming you have * instead of &(which is incorrect as mentioned in another answer).
所以你正在打电话给delete()
一些没有通过new
分配的东西试试这个。
MemoryObject *foo=new MemoryObject();
foo->release();
编辑:由于以下原因,这仍然不起作用。
在clean()
内部,您正在删除dead
的元素,该元素this
当前对象。所以简而言之,你正在做这样的事情
class A
{
void delete_this()
{
delete(this);
//At this point "this" is a dangling pointer and you should not use it.
}
};
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- C++中带有List类的迭代器Segfault
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 使用"std::unordereded_map"映射到"std::list"对象
- 程序崩溃并显示"std::out_of_range"错误
- GCC对可能有效的代码抛出init list生存期警告
- CoInitialize()在单独的线程上崩溃而不返回
- 使用std::list创建循环链表
- 使用调试/崩溃报告将应用程序部署到客户端
- 重载Singly Linked List中的赋值运算符
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 连续使用 std::list 会导致崩溃
- std::list 反向迭代和擦除导致崩溃
- std::list libev 回调崩溃
- 在c++中对STL List使用push_back()会导致访问冲突,崩溃