2013-03-25 20 views
11

これを2時間デバッグしています。私はQString::toStdStringstd :: stringデストラクタでQString :: toStdString()がクラッシュする

QString s = "testtesttesttesttesttest"; 
const std::string &temp = s.toStdString(); 

を呼び出す場合プログラムは、後に、私はそれが最初にメモリ破損を思ったのstd ::文字列デストラクタ

__CLR_OR_THIS_CALL ~basic_string() 
    { // destroy the string 
    _Tidy(true); // <---- It crashes on this line. 
    } 

にクラッシュするが、これはmain()がのみ2行が含まれている場合でも起こります。なぜこのようなことが起こるのか誰にも知られているのですか?

My Qtバージョンは4.8.1です。

+0

あなたはQtのどのバージョンを使用していますか?参照の代わりに文字列 'string temp = s.toStdString();'のコピーを保存するとどうなりますか? – RedX

+0

'string temp = s.toStdString();'と同じことが起こります。これは 'toStdString()'によって返された一時変数のデストラクタが直ちに呼び出されるため、早く起こります。 Qtのバージョンはどのように表示されますか?どこを見ますか?このプロジェクトは他の人によって設定されていますが、Qt CreatorだけでVisual StudioでQtを使った経験はありません。 – sashoalm

+1

これを試してください: 'std :: string stdUtf8 = qs.toUtf8()。constData();' – Najzero

答えて

8

あなたのQt DLLはSTLサポートとコードとまったく同じCランタイムライブラリでコンパイルする必要があります。同時に2つの異なるCRTを使用しているように見えます。これは、Qtによって1つのヒープ上に作成されたオブジェクトを、プログラムで使用されるヒープに破壊します。

依存関係ウォーカーでDLLの使用状況を確認してください!

+0

私は.exeとQtCored4.dllの両方を開きましたが、何を探すべきか分かりません。彼らにはたくさんの依存関係があります。異なるCRTを使用しているかどうかはどのように分かりますか?別の名前、または他の何か? – sashoalm

+0

あなたのアプリケーションに使用しているのと同じコンパイラでQtをコンパイルしてください。デバッグとリリースを混在させないようにしてください。 – drescherjm

+0

DependencyWalker( "Profiling")からアプリケーションを起動し、読み込まれたMS-CRTの数を確認してください。複数ある場合は、問題に遭う可能性が高いです。 – Jens

0

私は別の方法で問題に取り組んだ。 Visual Studioから新しいプロジェクトを作成しましたが、テストコードがクラッシュしませんでした。 * .vcprojファイルとWinMergeとの違いを調べると、クラッシュはプロジェクトのカスタム変更によって引き起こされていることがわかりました - あなたはそれを推測しました - ランタイムライブラリ。これは、クラッシュを再生する原因となる最小限の違いでのWinMergeにより作成されたパッチです:

112c112 
<    RuntimeLibrary="3" 
--- 
>    RuntimeLibrary="1" 
126a127,128 
>    LinkLibraryDependencies="true" 
>    UseLibraryDependencyInputs="false" 
127a130,131 
>    IgnoreAllDefaultLibraries="false" 
>    IgnoreDefaultLibraryNames="msvcrtd.lib" 
0

最も可能性の高い原因は、あなたのランタイムライブラリは、「マルチスレッド(/ MT)」であり、あなたが変更する必要があるかもしれません

「マルチスレッドデバッグ(/ MTd)」から「マルチスレッドデバッグ(マルチスレッドデバッグ)」に変更した場合は、「マルチスレッドDLL(/ MD) DLL(/ MDd) "

Qtが奇妙にコンパイルされている場合、解決方法は逆になります。

あなたは上のことを見つけるだろう "設定プロパティ - > C/C++ - >コードGeneration->ランタイムライブラリ"

関連する問題