2011-07-01 12 views
1

Cライブラリから取得したJSONオブジェクトをQVariantに変換する関数があります。すべてのデータ型は正常です---ブール値、数値、文字列、オブジェクト/マップ---リストを除きます。関数がリストを返すと、 "RtlValidateHeapに指定された無効なアドレス"のために関数が終了するとクラッシュします。これは、二重の空きが発生したことを意味します。Visual Studio 2008でQVariantListを返すとクラッシュする

次のコードがエラーを示しています

QVariant no_crash() { 
    QVariantMap map; 

    map["Hello"] = "world!"; 
    qDebug() << map; 
    return map; 
} 
// QMap(("Hello", QVariant(QString, "world!"))) 

QVariant crash() { 
    QVariantList list; 

    list << "Hello world!"; 
    qDebug() << list; 
    return list; 
} 
// (QVariant(QString, "Hello world!")) 

私はこれについての記事を見てきましたが、それらのすべては、Visual Studio 2010と、それはQtのSDKのバイナリバージョンとの互換性がないことに関するように見えます。私はhttp://qt.nokia.com/downloads/sdk-windows-cppからダウンロードしたQt 4.7.3でこれを試しました。

クラッシュは、リストが有効範囲外になったときに発生します。戻り値がコールスタックに戻って伝播される限り、クラッシュは発生しません。


ありがとうございました。

はい、

:-)だろう、私は別の値を返すとき、コンパイラがQVariantを構築することを十分に承知していますが、私は私から明示的にどのようなコーディングに比べて、コンパイラが暗黙的に同様に良いQVarintを構築することを確信しています私が提供したリンクからインストールすると、MinGWとVisual Studio 2008の両方のライブラリがインストールされます。 \ Desktop \ Qt \ 4.7.3 \ msvc2008 \ libをグローバルlibファイルの検索パスに追加しました。プログラムを実行すると、Visual Studioの出力ウィンドウに\ Desktop \ Qt \ 4.7.3 \ msvc2008のDLLのみが表示されます。ロードされる。

msvcr90d.dllでエラーが発生します。おそらくメモリがもう一度解放されたときです。スタックが破壊されているように見えるので、伝えるのは難しいです。

アプリケーションはかなり大きなものですが、GUIはC++で書かれ、残りはCで書かれています。これは問題ではありますか?プログラムはmsvcp90d.dllとmsvcr90d.dllの両方を読み込みます。

+0

私は現在、ソースからQtをビルドしています。私は一度それを試してからコメントを追加します。 –

答えて

0

あなたのメソッドのシグネチャは

QVariant crash() 

は、あなたが代わりにあなたがQList <QVariant>

の同義語であるQVariantListを返すようにしようとしているQVariantのQVariantを返すべきである私は考えていませんあなたはこれを行うことができます。

あなたは私の意見でこれをコンパイルすることすらできません。多分これはあなたの問題ですか?

+0

QVariantでQVariantListsを保持できる –

0

私は、潜在的な問題のカップルを参照してください。

まず、あなたがにリンクSDKは、MinGWのコンパイラではなく、Visual Studio用です。コンパイラには正しいSDKを使用するか、ソースからQtを再コンパイルする必要があります。 VS2008の場合はhttp://qt.nokia.com/downloads/に移動し、「Qt Libraries for Windows - VS2008」をダウンロードしてください。

コードはコンパイルされます。QVariantMapまたはQVariantSetを含むQVariantが返されます。コンパイラはQVariantを構築しています。どのようなあなたのコードが実際にやっていることはこれです:

QVariant no_crash() { 
    QVariantMap map; 

    map["Hello"] = "world!"; 
    qDebug() << map; 
    return QVariant(map); // This returns a QVariant which contains a map of QVariants 
} 

QVariant crash() { 
    QVariantList list; 

    list << "Hello world!"; 
    qDebug() << list; 
    return QVariant(list); // This returns a QVariant which contains a list of QVariants 
} 

これがOKを動作するはずです - 私はここでそれをコンパイルし、それが私のために動作します。返されたQVariantでtoString()を呼び出すと、のリストという空の文字列が返され、QVariantではなくであるの文字列を返すなど、QVariantのタイプをチェックするだけで済みます。リスト)

+0

Visual Studio専用のバージョンをダウンロードしました。より速くダウンロードしてインストールできましたが、同じクラッシュが発生しました。 –

+0

ソリューションの個々のプロジェクトが静的なランタイムにリンクされていたのに対して、Qtライブラリは動的なランタイムにリンクされているというエラーが発生しました。 –

2

ソリューションの個々のプロジェクトが静的なランタイムにリンクされているのに対し、Qtライブラリは動的なランタイムにリンクされていることがわかりました。

解決策には含まれていませんが、リンクされている既にビルドされたプロジェクトの設定と同様に、20以上のプロジェクトの設定を見て、Cランタイムに静的にリンクされていても、アプリケーションがクラッシュする。

プロジェクトのプロパティを開いて、「構成プロパティー」 - >「C/C++」にナビゲートし、「コード生成」を選択してランタイムを変更します。ランタイムライブラリは、リリースターゲット用のマルチスレッドDLLと、デバッグターゲット用のマルチスレッドデバッグDLLである必要があります。

0

C/C++コード生成のランタイムライブラリオプションが、それぞれデバッグとリリースのマルチスレッドデバッグDLL(/ MDd)またはマルチスレッドDLL(/ MD)に設定されていることを確認してください。 QVariantMap,QVariantList,QModelIndexListなどのQtタイプはおそらく/ MD(Qtのdllで)で割り当てられ、/ MT(アプリケーションで)で割り当てが解除されると、クラッシュが発生すると思います。これにより、QString::toStdWString()のクラッシュを修正することもできます。これをリンクするには、Ignore All Default LibrariesをNoに設定し、Qtが使用するcrt dllを特定ライブラリに無視しないでください。

関連する問題