2011-09-12 14 views
1

私のプロジェクトには次のコードがあります。変数の破損C++ String Visual Studio 2005

g(const string& str) 
{ 
    printf("%s", str.c_str()); 
} 

f() 
{ 
    string str("whatever"); 

    g(str); 
} 

非常に大きなコードの一部です。 g()はdllにあり、apiはエクスポートされます。 f()は実行可能ファイルの一部です。このコードは正常に動作するために使用されました。しかし、現在は、デバッグ構成でのみ動作し、リリース構成では動作しません。デバッグしようとしたところ、g()strの内容が気になってすぐに最初の文がヒットしたことを知りました。それで、それはnullを出力します。

リリース構成は変更されていません。

助けてください。あなたは多分(あなたが異なるコンパイラフラグとDLLやプログラムをコンパイルしている、との違いにSTLの実装が異なっている

敬具、暗闇の中で シブ

+1

投票の締め切り:何が失敗しているのか分かるまで、元のコードを減らそうとしてください。投稿されたコードは動作を示さないため、質問は答えられません。答えは、あなたのコードのどこかに何かが間違っていることですが、それは建設的ではありません。異なるフラグでコンパイルした場合、STLの定義が異なる可能性があり、ODRと未定義の動作に違反することになることに注意してください(これは問題かもしれません)。 –

+0

これはビルドの問題のように思えます(おそらくリンカーと関係があります)。私のアドバイス:(1)きれいな再建を行う。 (2)DLLとメインプログラムの両方がリリースモードでビルドされていることを確認してください。 (3)メインプログラムを実行するときに正しいDLLを常にピックアップしてください。 (4)リリース構成が変更されていないと言っても、これが実際に正しいか再度確認してください。 – NPE

答えて

2

ワイルドショット1つではなく他のものでチェックイテレータを使用しています...)。これはODRの違反であり、未定義の動作を引き起こします。

一方のエンドはオブジェクトのバージョンを作成し、もう一方のエンドへの参照は渡しますが、もう一方のエンドは別の方法でメモリの解釈を試みます。

この場合、呼び出し元と呼び出し先の文字列のアドレスが同じであること、およびそのアドレスのメモリのビットパターンが同じであることを確認できるはずです。sizeof(std::string)呼び出しコード。その場合、両端が文字列を別々に解釈していると、ODR違反が発生します。すべてのプロジェクトを同じコンパイラフラグで再コンパイルします。

また、メインプログラムとDLL(または異なるDLL)でsizeof(std::string)の値が異なる場合、2つの定義があるという別のヒントがあります。サイズが異なる場合は、ODR違反があることが示されます。サイズが同じであっても、ODRに違反していないことを主張するために使用することはできません。同じサイズの異なる定義である可能性があります。

+0

これは可能性が高いです。依存関係ウォーカー(http://www.dependencywalker.com/)を使用して、異なるDLLがどのランタイムを使用しているかを確認できます。 (しかし、静的にリンクされたものでは動作しません。) – Macke

関連する問題