仅在发布版本中出错,从 std::vector 复制结构
Error in release build only, copying structure from std::vector
我试图使用 llvm 在 Xcode 4.2 中运行我的发布版本时遇到了一个奇怪的问题。我已经关闭了发布方案的所有优化设置,据我所知,发布版本与调试版本的所有设置匹配。无论如何,在使用物理库 Box2D 中的某些结构时会出现以下问题 - 但我不确定这个问题是否与此有关。
b2CircleShape* circleShape = new b2CircleShape();
circleShape->m_p.Set(0,0);
circleShape->m_radius = m_radius;
b2FixtureDef fixture;
fixture.shape = circleShape;
fixture.density = m_density;
m_fixtureDefs.push_back(fixture); // std::vector
b2FixtureDef fix2 = fixture;
b2FixtureDef fix3 = m_fixtureDefs[0] // EXC_BAD_ACCESS
当我删除对m_fixtures的所有访问实例时,没有问题发生。当我在开发方案中运行时,没有发生错误。我真的非常非常困惑,如果有人能指出我正确的方向以寻找错误,将不胜感激
编辑:
更多有趣的东西
for (vector<b2FixtureDef>::iterator i = m_fixtureDefs.begin() ; i != m_fixtureDefs.end(); ++i)
{
}
这似乎永远循环,让我非常困惑。似乎结构m_fixturesDef存在某种问题,但我不知道为什么任何奇怪的腐败只发生在这个特定的变量中。
默认情况下,
POD 对象不会在C++中初始化,因此它们的初始值(除非显式初始化)本质上是随机的。
在调试模式下构建时,编译器通常会插入额外的初始化代码以清零值。因此,您可以轻松查看调试版本和发布版本之间的不同行为。
查找此类问题的一种快速方法是检查编译器警告;查看是否在初始化变量之前使用它(您可能需要打开警告)或类似的东西。
注意:您可以通过确保代码在编译时出现零警告且警告级别尽可能高(通常比默认值高一步)来解决许多严重问题。(警告实际上是代码中的逻辑错误)。
相关文章:
- 使用std::vector的OpenCL矩阵乘法
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- std::vector的包装器,使数组的结构看起来像结构的数组
- 编译器如何区分std::vector的构造函数
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 在std::vector上存储带有模板的类实例
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 为什么std::vector比数组慢
- std::vector::迭代器是否可以合法地作为指针
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 为什么std::vector和std::valarray初始化构造函数不同
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 在没有未定义行为的情况下实现类似std::vector的容器
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 如何将AERT_Allocate与 std:vector 一起使用
- 推导 std::vector::back() 的返回类型
- 如何将原始字节附加到 std::vector?
- std::vector 没有重载函数的实例与参数列表匹配
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?