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

标签 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 中运行得很好。

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

最佳答案

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

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

关于c++ - 列表迭代器不兼容断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19607342/

相关文章:

c++ - 无法实现单例模式

c++ - 使用 _beginthreadx 将结构传递给线程

c++ - fabsf 是 C++11 中 std 命名空间的一部分吗?

java - java中的数组结构

c++ - GCC: --whole-archive 静态链接到 pthread 的方法在最近的 gcc 版本中停止工作

android - 在 arm64-v8a lib 上运行 ndk-stack 失败并出现错误文件格式无法识别

javascript - 使用 debug-brk 启动 Sails 不会运行 Grunt?

c - 在 ';' token C 代码之前预期为 '{'

c++ - 在 OpenCV C++ 中估计基本矩阵之前标准化对应点的正确方法是什么?

c++ - 从 Visual Studio 2010 开始,取消引用集合上的迭代器时的 Const 引用