0

Qt で JSON オブジェクトを作成し、QJson を使用して QString に変換しています。これは (通常) 正常に動作し、この場合は正常に動作しますが、私の Qt データ構造のデストラクタでは、アクセス違反でクラッシュします。オブジェクトは正常に構築され、ネットワーク接続を介して送信され、関数が終了した後、アプリケーションがクラッシュします。

私のコードは次のようになります。

void bar()
{
    QVariantMap data;
    data.insert("Id", 1);
    QList<QVariant> list; //QVariantList

    for (QMap<...>:ConstIterator ... ) //Loop through a Map
    {
        QMap<QString, QVariant> singleEntry; //QVariantMap
        singleEntry.insert("LocalId", it.value());
        QList<QVariant> entryList; //QVariantList
        for (...) //Loop through another structure
        {
            entryList.append("foo");
        }
        singleEntry.insert("List", entryList);
        list.append(singleEntry);
    }
    data.insert("Entries", list);

    QJson::Serializer.serialize(data); // Works fine
} // Crash here

構築される内側のループを削除するとentryList、すべてが正常に機能します。のデストラクタはdata内容を削除できないようですが、理由がわかりません。データ構造全体は、シリアル化中に問題ないように見えますが (QJson が指定されたデータで何も変更しないことを願っています)、クリーンアップできません..

よろしく、 トバイアス

4

2 に答える 2

1

Raiv が言ったように、これはデバッグ dll とリリース dll が混在している場合に発生する可能性がありますが、私の意見では、アプリケーションと Qt DLL が異なる CRT ライブラリを使用している場合にも発生する可能性があります。一部の人々は、自分のマシンで Qt を再コンパイルしたときに問題が消えたと言っています。これは、Qt 再構築後の CRT dll がアプリのものと同じであるためだと思います。C/C++ コード生成のランタイム ライブラリ オプションを、デバッグとリリースに対してそれぞれマルチスレッド デバッグ DLL (/MDd) またはマルチスレッド DLL (/MD) に設定してみてください。QVariantMap、QVariantList、QModelIndexList などの一部の Qt タイプは、おそらく /MD (Qt の dll 内) で割り当てられ、/MT (アプリ内) で割り当てが解除されると、これがクラッシュの原因になると思います。これにより、QString::toStdWString() でのクラッシュも修正できます。

于 2013-04-22T16:45:06.310 に答える
0

私のニーズに合った小さな回避策があります。なぜこのクラッシュが発生するのかはまだわかりませんが、どちらが問題なのかはわかっています。

私はこのような静的構造を構築しようとしました:

QVariantMap
  QVariantList
    QVariantMap
      QVariantList

そしてクラッシュします。一番下の QVariantList を削除し、代わりに QVariantMap などを追加すると、正常に動作します。この場合の入れ子レベルの問題だと思います。

コンマ区切りの QString としてリストに参加したところ、正常に動作します。

このようなネストされた構造体を破棄する際にクラッシュする理由 (別の情報: QVariants をヒープに割り当てて、自分で削除するか、スタックを削除するかは問題ではありません) と、それを修正する方法を知っている人がいる場合は、お知らせください。

于 2011-08-11T09:38:36.457 に答える