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

时间:2012-04-19 04:53:43

标签: c++ xcode box2d release-mode

我有一个奇怪的问题,试图让我的发布版本在Xcode 4.2中使用llvm工作。我已经关闭了发布方案的所有优化设置,据我所知,发布版本与调试版本的所有设置相匹配。无论如何,当使用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存在某种问题,但我不知道为什么发生的任何奇怪的腐败只发生在这个特定的变量中。

1 个答案:

答案 0 :(得分:2)

默认情况下,POD对象不是在C ++中初始化,因此它们的初始值(除非显式初始化)本质上是随机的。

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

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

注意:您可以通过确保代码编译为零警告并且警告级别合理(通常高于默认值)来解决许多严重问题。 (警告在您的代码中确实是一个逻辑错误。)