2012-04-19 7 views
0

llvmを使用してXcode 4.2でリリースビルドを動作させるのに奇妙な問題が発生しました。リリーススキームの最適化設定はすべて無効にしています。リリースビルドには、デバッグビルドのすべての設定と一致することがわかります。これに関係なく、物理ライブラリであるBox2Dから構造体を操作する場合、次の問題が発生します。リリースビルドでエラーが発生しました。std :: vectorの構造体をコピーします。

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へのアクセスのすべてのインスタンスを削除すると、問題は発生しません。開発スキームで実行すると、エラーは発生しません。誰かがそれを探すためにエラーのために正しい方向に私を指すことができれば、私は、本当に、本当に混乱していますずっと

EDITいただければ幸いです。

もっと面白いものを

for (vector<b2FixtureDef>::iterator i = m_fixtureDefs.begin() ; i != m_fixtureDefs.end(); ++i) 
{ 

} 

これはループに表示されます永遠に、私は非常に混乱させる。構造体m_fixturesDefに何らかの問題があるようですが、なぜこのような変種でしか発生していない奇妙な破損が起こっているのかどうかわかりません。

+0

メモリエラーのように見えるので、デバッグは難しくなります。あなたはvalgrindでそれを実行しようとする必要があります。また、 'circleShape'が' m_fixtureDefs'の前に削除されることもありますか? – juanchopanza

+0

私は今それを試みます。いいえ、最初の抽出はコード内で「そのまま」です。 – Tomas

+0

デフォルトコンストラクタb2FixtureDef :: b2FixtureDef()をチェックし、コンストラクタb2FixtureDef :: b2FixtureDef(const b2FixtureDef&)b2FixtureDef :: operator =(const b2FixtureDef&)をコピーします。変数値とプログラムフローを表示するには、debug printを使用します。 – alexander

答えて

2

デフォルトでは、PODオブジェクトはC++では初期化されないため、初期値(明示的に初期化されていない限り)は本質的にランダムです。

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

この種の問題をすばやく見つけるには、コンパイラの警告を確認する必要があります。変数が初期化される前に変数を使用しているかどうかを確認します(警告をオンにする必要があるかもしれません)。

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

+0

私はコンパイラの警告を持っていない、とプロジェクトもclangを実行します。問題を見つけるためのヒント? – Tomas

+0

@TomasCokis:すべての警告をオンにしましたか?私の絶対最小値は '-ansi -pedantic -Wall -Werror'です。通常、私は他のいくつかを持っていますが、-ansi -pedantic -Wall -Werror -Wextra -Wstrict-aliasing -Windreachable-Code -Wshadow -Weff ++ ++ XCode coompilerは、同じ旗がどんなことが起こっているかを見るためにそれらをオンにする –

+0

私は一連の警告をオンにし、ファイルのいくつかの終わりを固定し、プロジェクトの設定を1時間ほど使いこなし、プロジェクトファイルを元に戻した。私は問題が何だったのかよく分かりませんが、警告が私に問題を解決させるように思われたので、これを受け入れるつもりです – Tomas

関連する問題