0

llvmを使用してXcode4.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 ++で初期化されないため、初期値(明示的に初期化されていない場合)は本質的にランダムです。

デバッグモードでビルドする場合、コンパイラは通常、値をゼロにするために追加の初期化コードを挿入します。したがって、デバッグビルドとリリースビルドの間のさまざまな動作を簡単に確認できます。

この種の問題を見つける簡単な方法は、コンパイラの警告を確認することです。初期化される前に変数を使用しているかどうか(警告をオンにする必要がある場合があります)または同様のものを確認してください。

注:コードがゼロの警告でコンパイルされ、警告レベルが妥当なレベル(通常はデフォルトより1ステップ上)になるようにすることで、多くの重大な問題を修正できます。(警告は実際にはコードの論理エラーです)。

于 2012-04-19T06:08:09.413 に答える