列出迭代器不兼容断言失败
List iterators incompatible assertion fail
我不知道为什么在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
的原始指针的静态列表。共享指针在程序终止时释放,但此时原始指针列表已被销毁,因此断言失败。
这显然是一个糟糕的设计决定。
调试器奇怪的单步执行行为是尝试在调试器中运行发布版本的典型行为。请改用调试版本。
相关文章:
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- uint_not_usable_without_attribute在业力规则中使用数字生成器时静态断言失败
- 从 exe 文件 (Visual Studio ) 启动时调试断言失败
- 在 CppUnit 中测试中止断言失败
- 使用扫描的调试断言失败
- 为什么我的Qt程序在断言失败后继续运行?
- 图片不显示,关闭时出错 --> 调试断言失败!表达式:is_block_type_valid(标头>_block_use)
- 访问提升:shared_ptr 主范围外崩溃,断言失败:px != 0.指针的正确用法是什么?
- C++ 调试断言失败 - 矢量下标超出视觉工作室的范围
- 错误:断言失败 (src.type() == CV_8UC1) 在阈值中
- Boost Beast 异步服务器失败,断言失败:(id_ != T::id) 在多个 aync 调用中
- 使用imwrite OpenCV时断言失败
- 调试断言失败的缓冲区!=nullptr
- 使用 ofstream 写入文本文件时断言失败
- 提升继续恢复断言失败
- 获取有关调试断言失败的错误:表达式:"(_Ptr_user &(_BIG_ALLOCATION_ALIGNMENT -1)) == 0" &&0
- OpenCV(3.4.1) 错误:断言失败(变暗 <= 2 && step[0] > 0) in cv::Mat::locateROI
- 在Win10上使用带有Qt5的OpenCV3.0,调试断言失败
- MFC GetDC() 断言失败 - "Not a window"
- OpenCV 错误:断言失败 - 矩阵减去