我的代码是用来进行内存管理的,但它会在某个时刻崩溃,我会从“现场”中删除一个对象。列出并将其放在“死亡”上。之一:
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;
}
答案 0 :(得分:1)
在您的clean
功能中:
delete(&iterator);
那将编译,但会尝试删除迭代器本身 - 它在堆栈上(会崩溃)。
我怀疑你想要:
delete(*iterator);
答案 1 :(得分:1)
您无法删除未使用new分配的对象。 MemoryObject foo;
不是allocatetd with new。
答案 2 :(得分:0)
您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
的{{1}}元素。简而言之,您正在做类似这样的事情
class A
{
void delete_this()
{
delete(this);
//At this point "this" is a dangling pointer and you should not use it.
}
};