C++ 列表迭代器不兼容断言失败

C++ 列表迭代器不兼容断言失败,c++,debugging,c++11,visual-studio-2013,C++,Debugging,C++11,Visual Studio 2013,我无法理解为什么在删除上引发此异常。我在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() { // Remo

我无法理解为什么在
删除
上引发此异常。我在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);
}
//初始化类。
int对象::nextID=0;
列表对象::对象;
对象::对象(字符串名称)
{
集合名(名称);
nextID++;
对象。推回(此);
}
对象::~Object()
{
//从对象列表中删除。
对象。移除(此);
}
Object
I派生出堆上创建的其他类和对象,并将其降级到
shared\u ptr
s。没有其他代码引用作为静态变量的
Object::objects

在调试器中(我使用的是VS2013),我注意到了奇怪的步进行为,空行被步进并在从未调用的代码之间跳跃,因此我不确定这是否是VS2013的错误。如果有区别的话,我将在其他地方使用C++11的一些新特性

此外,调用析构函数时,
objects
的大小为0,尽管我看到它在构造函数中被递增为1。有人能帮忙吗

还有一件事:代码在GCC/code::Blocks中运行良好


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

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

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

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

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

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


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

你忘了在VS中禁用优化吗?优化被破坏了。可能你没有运行你认为正在运行的代码。向代码中添加一些
OutputDebugString
s,重新编译,并查看调试输出窗口。我想我知道为什么,尽管我需要找到一个解决方案:这是静态对象破坏的顺序。我从
Object
派生
GameObject
,并在另一个静态变量中保留
GameObjects
的共享指针,而不是
Object
指针。现在,这些共享指针在程序终止时释放,但到那时,原始
对象
指针的静态列表已经被销毁。对象是否有复制构造函数或赋值运算符?默认设置不会为您做正确的事情。(第三条规则)你没有忘记在VS中禁用优化吗?优化被破坏了。可能你没有运行你认为正在运行的代码。向代码中添加一些
OutputDebugString
s,重新编译,并查看调试输出窗口。我想我知道为什么,尽管我需要找到一个解决方案:这是静态对象破坏的顺序。我从
Object
派生
GameObject
,并在另一个静态变量中保留
GameObjects
的共享指针,而不是
Object
指针。现在,这些共享指针在程序终止时释放,但到那时,原始
对象
指针的静态列表已经被销毁。对象是否有复制构造函数或赋值运算符?默认设置不会为您做正确的事情。(第三条规则。)@ScottMcP MVP,我问了我的问题,因为我(以及我所在的整个团队)总是使用发布构建,但禁用了优化,这允许正确的调试器步进。我们在dev机器上的本地构建和构建服务器优化过程中使用了这个选项。我已经通过删除对象列表“解决”了
对象
列表断言失败的问题,到目前为止,我不需要这样做。但奇怪的脚步声还在那里!我也尝试过重建,同样。@ScottMcP MVP,我问了我的问题,因为我(和我所在的整个团队)总是使用发布版本,但禁用了优化,这允许正确的调试器步进。我们在dev机器上的本地构建和构建服务器优化过程中使用了这个选项。我已经通过删除对象列表“解决”了
对象
列表断言失败的问题,到目前为止,我不需要这样做。但奇怪的脚步声还在那里!我也尝试过重建,同样的。