我无法弄清楚为什么会在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
指针的静态列表可能已经被销毁了。
答案 0 :(得分:1)
问题是破坏静态对象的顺序。我从GameObjects
派生了Objects
,并保留了GameObjects
的共享指针的静态列表以及上面指向Objects
的原始指针的静态列表。共享指针在程序终止时被释放,但到那时原始指针列表已经被销毁,因此断言失败。
这显然是一个糟糕的设计决定。
答案 1 :(得分:0)
调试器奇怪的步进行为是尝试在调试器中运行发布版本的典型行为。改为使用调试版本。