gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:46:40 25 4
gpt4 key购买 nike

我不明白为什么在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com