列出迭代器不兼容断言失败

List iterators incompatible assertion fail

本文关键字:断言 失败 不兼容 迭代器      更新时间:2023-10-16

我不知道为什么在remove上抛出此异常。我在 Object.cpp 中有以下代码:

//  Initialize class.
int Object::nextID = 0;
list<Object*> Object::objects;
Object::Object(string name)
{
    SetName(name);
    nextID++;
    objects.push_back(this);
}

Object::~Object()
{
    //  Remove from the list of objects.
    objects.remove(this);
}

Object我派生了其他类和对象正在堆上创建并降级到shared_ptr。没有其他代码引用Object::objects,这是一个静态变量。

在调试器中(我使用的是VS2013),我注意到奇怪的步进行为,空行被单步进入并在从未调用的代码之间跳来跳去,所以我不确定这是否是VS2013的错误。万一有什么不同,我在其他地方使用了 C++11 的一些新功能。

此外,当调用析构函数时,objects的大小为 0,即使我已经看到它在构造函数中增加到 1。谁能帮忙?

还有一件事:代码在GCC/Code::Blocks中运行得很好。

更新:我想我知道为什么,尽管我需要找到一个解决方案:这是静态对象的破坏顺序。我从Object派生GameObject,并且我将共享的GameObjects指针保存在另一个静态变量中,而不是Object指针。现在,这些共享指针在程序终止时发布,但到那时,上面的原始Object指针的静态列表可能已经被销毁了。

问题是静态对象的破坏顺序。我从Objects派生了GameObjects,并保留了指向GameObjects的共享指针的静态列表和上面指向Objects的原始指针的静态列表。共享指针在程序终止时释放,但此时原始指针列表已被销毁,因此断言失败。

这显然是一个糟糕的设计决定。

调试器奇怪的单步执行行为是尝试在调试器中运行发布版本的典型行为。请改用调试版本。