14

私はこれを2時間デバッグしてきましたが、要約するとこれです。電話したらQString::toStdString

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

プログラムは後でstd::stringデストラクタでクラッシュします

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

最初はメモリの破損だと思っていましたが、このmain()2行しか含まれていなくても発生します。なぜこれが起こるのか、そしてどうすれば修正できますか?

私のQtバージョンは4.8.1です。

4

3 に答える 3

11

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

Dependency WalkerでDLLの使用状況を確認してください!

于 2013-03-25T09:23:40.517 に答える
1

最も可能性の高い理由は、ランタイムライブラリが「マルチスレッド(/ MT)」であり、「マルチスレッドDLL(/ MD)」に変更する必要があることである可能性があります(リリースバージョンを使用している場合)

デバッグバージョンを使用している場合は、「マルチスレッドデバッグ(/ MTd)」から「マルチスレッドデバッグDLL(/ MDd)」に変更してください。

Qtの奇妙なコンパイルがある場合、解決策は反対になります。

これは、「構成プロパティ-> C /C++->コード生成->ランタイムライブラリ」にあります。

于 2016-03-23T20:36:17.643 に答える
0

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

112c112
<               RuntimeLibrary="3"
---
>               RuntimeLibrary="1"
126a127,128
>               LinkLibraryDependencies="true"
>               UseLibraryDependencyInputs="false"
127a130,131
>               IgnoreAllDefaultLibraries="false"
>               IgnoreDefaultLibraryNames="msvcrtd.lib"
于 2013-03-26T08:55:12.197 に答える