0

我在尝试使用 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 存在某种问题,但我不知道为什么正在发生的任何奇怪的损坏只发生在这个特定的变量中。

4

1 回答 1

2

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

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

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

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

于 2012-04-19T06:08:09.413 回答