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の両方を読み込みます。
私は現在、ソースからQtをビルドしています。私は一度それを試してからコメントを追加します。 –