gpt4 book ai didi

c++ - 连续使用 std::list 导致崩溃

转载 作者:行者123 更新时间:2023-11-28 01:46:18 37 4
gpt4 key购买 nike

我的代码旨在进行内存管理,但在我从“事件”列表中删除一个对象并将其放置到“死”列表中的某个点时它一直崩溃:

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) 和 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);

这会编译,但会尝试删除迭代器本身 - 它在堆栈上(会崩溃)。

我怀疑你想要:

    delete(*iterator);

关于c++ - 连续使用 std::list 导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44943673/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com