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

时间:2013-10-26 13:34:45

标签: c++ debugging c++11 visual-studio-2013

我无法弄清楚为什么会在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中运行得很好。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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