我不明白为什么在 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 的原始指针的静态列表
。共享指针在程序终止时被释放,但到那时原始指针列表已经被销毁,因此断言失败。
这显然是一个糟糕的设计决定。
关于c++ - 列表迭代器不兼容断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19607342/