10

私は文字通り1週間ずっと取り組んできたかなりトリッキーな問題に取り組んでいます。私は非常に難しい壁にぶつかり、額をぶつけて痛いので、誰かが私を助けてくれることを願っています.

このプロジェクトに Visual Studio 2005 を使用しています。2008 をインストールしましたが、試してみると同様の問題が発生していました。

現在、OpenCv1.1 に対してコンパイルされたアプリケーションが動作しており、それを 2.2 に更新しようとしています。新しいライブラリへのリンクを静的に切り替えると、アプリケーションがクラッシュしますが、リリース モードでのみ発生します。したがって、動的リンクとデバッグの両方が正常に機能します。

std::vectorを呼び出すとクラッシュしpush_backます。

次に、opencv でいくつかの基本的なコードを実行するサンプル テスト アプリケーションを思いつきました。このコードは問題なく動作し、まったく同じコードを取得してアプリケーションに追加しました。そのコードは失敗します。

次に、メインの GUI とそのコードを呼び出した 1 つのクラス以外のコード オブジェクトをインスタンス化しないように、アプリケーションを完全に削除しましたが、それでもクラッシュしました。ただし、そのコードをメイン GUI で直接実行すると、問題なく動作しました。

次に、膨大な量のアプリケーション (インスタンス化されるべきではないコンポーネント内) をコメントアウトし始め、最終的には...

メソッドを持つクラスがあります

void Foo()  
{  
    std::vector<int> blah;  
    blah.begin();  
}  

このメソッドがヘッダーで定義されている場合、テスト コードは機能しますが、このコードが cpp ファイルで定義されている場合はクラッシュします。また、std::vector<double>intの代わりに使用しても機能します。

次に、コンパイラ オプションを試してみましたが、最適化をオフ (/Od) にし、インライン関数展開を __inline のみ (/Ob1) に設定すると、cpp ファイル内のコードでも機能します。

もちろん、完全なアプリケーションに戻ってこれらのコンパイラ オプションを変更すると、アプリケーションはクラッシュします。

誰かがこれについて何か洞察を持っているなら、私に知らせてください。

ありがとう、ライロン

4

3 に答える 3

8

ARGH!解決策がわかりました。

私たちのソリューションでは、_SECURE_SCL = 0を定義しましたが、ビルドしたサードパーティのライブラリでは、それは未定義でした(つまり、= 1)。_SECURE_SCLを0に設定すると、ランタイムが大幅に短縮されると思われますが、含まれているすべてのライブラリで同じように実行する必要があります。そうしないと、配列サイズの処理が異なります。

http://msdn.microsoft.com/en-us/library/aa985896%28v=vs.80%29.aspx

楽しい一週間でした。

于 2011-03-03T17:45:58.593 に答える
6

vector <>のようなSTLクラスでは、イテレータのデバッグサポートが原因で、リリースビルドとデバッグビルドの間にレイアウトの不一致があります。問題は、アプリケーションのリリースビルドで.libまたはDLLのデバッグビルドをリンクし、それらの間でSTLオブジェクトを交換するときに発生する問題とまったく同じように動作します。その結果、ヒープの破損とアクセス違反の例外が発生します。

ビルド設定を3回チェックし、リリースビルドの.libsのリリースビルドとデバッグビルドの.libsのデバッグビルドのみをリンクするようにします。

于 2011-03-03T00:58:19.540 に答える
0

試していただけますか:

void Foo()  
{  
    std::vector<int> blah;
    blah.reserve(5);
    blah.begin();  
} 
于 2011-03-03T01:17:00.523 に答える