C++ 连续使用std::list会导致崩溃
我有一些用于内存管理的代码,但在我从“活动”列表中删除一个对象并将其放在“死亡”列表中的某个点上,它会不断崩溃:C++ 连续使用std::list会导致崩溃,c++,eclipse,stdlist,C++,Eclipse,Stdlist,我有一些用于内存管理的代码,但在我从“活动”列表中删除一个对象并将其放在“死亡”列表中的某个点上,它会不断崩溃: class MemoryObject { private: static std::list <MemoryObject *> alive, dead; long references; public: MemoryObject() { alive.push_back(this); references = 0;
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;
在
clean
功能中,您有:
delete(&iterator);
这将编译,但将尝试删除迭代器本身-它位于堆栈上(将崩溃)
我怀疑你想要:
delete(*iterator);
在
clean
功能中,您有:
delete(&iterator);
这将编译,但将尝试删除迭代器本身-它位于堆栈上(将崩溃)
我怀疑你想要:
delete(*iterator);
无法删除未分配新资源的对象<代码>内存对象foo代码>未分配给new。无法删除未分配给new的对象<代码>内存对象foo代码>不分配给new。您
仅删除通过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).
因此,您正在对未通过new
分配的内容调用delete()
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.
}
};
您仅删除通过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).
因此,您正在对未通过new
分配的内容调用delete()
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.
}
};
在clean
函数中,您有delete(&iterator)
。这几乎是不正确的。请说明您是如何调用函数的。请阅读以下内容:这里并不清楚您想要实现什么。foo
的内存已经被自动管理,您不必在clean
函数中执行任何额外的操作,您拥有delete(&iterator)
。这几乎是不正确的。请说明您是如何调用函数的。请阅读以下内容:这里并不清楚您想要实现什么。foo
的内存已经自动管理,您不需要做任何额外的事情