连续使用std :: list会导致崩溃

时间:2017-07-06 08:32:29

标签: c++ eclipse stdlist

我的代码是用来进行内存管理的,但它会在某个时刻崩溃,我会从“现场”中删除一个对象。列出并将其放在“死亡”上。之一:

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;
}

3 个答案:

答案 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.
    } 
};