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
的内存已经自动管理,您不需要做任何额外的事情