【发布时间】:2017-07-06 17:24:48
【问题描述】:
我的代码是用来进行内存管理的,但是在我从“活动”列表中删除一个对象并将其放置到“死”列表中的某个点上,它总是崩溃:
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)。这几乎不正确。 -
请说明你是如何调用函数的。
-
它并不清楚你想在这里实现什么。
foo的内存已经自动管理了,你不需要做任何额外的操作