1

我无法弄清楚为什么在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);
}

ObjectI 派生其他类和对象正在堆上创建并降级到shared_ptrs。没有其他代码引用Object::objects,这是一个静态变量。

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

此外,objects在调用析构函数时大小为 0,即使我在构造函数中看到它被递增为 1。任何人都可以帮忙吗?

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

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

4

2 回答 2

1

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

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

于 2013-10-27T11:09:16.800 回答
0

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

于 2013-10-26T13:54:18.417 回答