0

最終的に別のクライアント アプリケーションによって使用されるライブラリを出力するアプリケーションを構築しています。/MDd最近、コード生成 (デバッグ CRT ライブラリ) を使用してデバッグ モードでアプリケーションをビルドしていて、デバッグ モードでも使用してクライアント アプリケーションがリリース CRT に対してビルドされていることを発見し/MDました。したがって、これによりメモリ ヒープの破損エラーが発生する可能性があります。確認するために、リリース モードですべてをテストしたところ、問題なく動作しているようです。

この問題に対処するために、release with debug infoビルド ( /MD) も実行して、クライアント アプリケーションのデバッグ ビルドをこのビルドにリンクしようとしrelwithdebinfoましたが、サンプルをテストしているときに、クライアント アプリケーションで奇妙な動作が見られます。正確には、文字列を割り当てるときは、次のように言います。

std::string client_str = some_namespace_in_my_library::class_name::string_name,

client_str が割り当てられておらず、空のままになっていることがわかりました。これは、すべてがデバッグでビルドされた場合 (ミックス アンド マッチが存在する場合) は正常に機能していました。なぜこれが起こっているのですか?上記の名前空間の文字列は、クラスの静的パブリック メンバーですclass_name。これはすべて MS VC++ 2005 に関するものです。アドバイスやヘルプをいただければ幸いです。ありがとう!

4

1 に答える 1

1

私の推測では、チェックされたイテレータのために、1 つの定義規則に違反していると思います。参照: http://msdn.microsoft.com/en-us/library/aa985896(v=vs.80).aspx

問題は、上記の Bo が既に書いたように、STL で使用される構造体とクラスがデバッグ ビルドとリリース ビルドで同じサイズではなく、チェック イテレータの有無にかかわらずより問題があることです。

もう 1 つの理由として、リリース ビルドの Visual Studio のバージョンで、チェックされた反復子の既定値が変更されたことが考えられます。vs2005 と vs2008 ではデフォルトでオンになっていましたが、2010 以降ではオフになっています (すべての依存ライブラリとそのビルド方法を確認してください!)

ここで最も重要なルールは、すべてのコンパイル単位が と の両方でまったく同じ設定を使用していることを確認すること_SECURE_SCLです_HAS_ITERATOR_DEBUGGING

もう1つ覚えていますが、リンクが見つかりません。チェックされたイテレータの有無にかかわらずデバッグビルドは互換性があるはずですが、vs2005にはこれが正しく実装されていないバグがあり、後のバージョンで修正されたと思います。

于 2012-09-13T03:58:52.993 に答える