仅在发布版本中出错,从 std::vector 复制结构

Error in release build only, copying structure from std::vector

本文关键字:std vector 结构 复制 出错 布版本 版本      更新时间:2023-10-16

我试图使用 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++中初始化,因此它们的初始值(除非显式初始化)本质上是随机的。

在调试模式下构建时,编译器通常会插入额外的初始化代码以清零值。因此,您可以轻松查看调试版本和发布版本之间的不同行为。

查找此类问题的一种快速方法是检查编译器警告;查看是否在初始化变量之前使用它(您可能需要打开警告)或类似的东西。

注意:您可以通过确保代码在编译时出现零警告且警告级别尽可能高(通常比默认值高一步)来解决许多严重问题。(警告实际上是代码中的逻辑错误)。