1

非互換性の問題を回避するために推奨されていたため、MSVC2008 を使用してソースから Qt をビルドしました。ただし、QList オブジェクトを返す Qt 関数を使用するときに問題が発生します。

QList<QNetworkInterface> *netInterfaces = new QList<QNetworkInterface>;
*netInterfaces = QNetworkInterface::allInterfaces();
delete netInterfaces;

このコードは、メモリを解放しようとすると、free.c の「delete netInterfaces」で常にクラッシュします。すべてが同じバージョンの MSVC でコンパイルされているため、ヒープが破損していると表示されますが、その理由はわかりません。

関数を呼び出すだけでも、QList オブジェクトを返すすべての Qt 関数で発生します。

QNetworkInterface::allInterfaces();

上記のコードでは、Qt によって割り当てられたヒープを解放しようとすると、アプリケーションは常にすぐにクラッシュします。奇妙なことに、これはデバッグ ビルドでのみ発生します。リリース ビルドは、クラッシュすることなく正常に動作します。

Qt 4.8.0 は /MT (マルチスレッド) でコンパイルされており、ライブラリに動的にリンクしています。私のアプリケーションもマルチスレッドとしてコンパイルされています。

ここで問題の考えられる原因を知っている人はいますか?

4

1 に答える 1

2

私は自分の問題の解決策を見つけました。どうやら Qt には独自のヒープ アロケーターのセットがあり、マルチスレッド (/MT) ビルドと共有ライブラリを使用している間、Qt は DLL 内の独自のメモリ ハンドラーを使用してヒープを割り当てていました。このメモリが Qt によって割り当てられた後、私のアプリケーションは自分のコードでこれらのメモリ ブロックを解放しようとしましたが、Qt とメイン アプリケーションの間でヒープ構造が異なるため、クラッシュが発生しました。

/MT フラグを使用して Qt を再構築しましたが、共有ライブラリではなく静的ライブラリを作成しました。Qt をアプリケーションに静的にリンクした後、すべてのヒープの問題が魔法のように解消されました。

ここでの説明は少し間違っているかもしれませんが、少なくとも解決策がこのスレッドを見つけた人の助けになることを願っています. インターネット上でこの問題を抱えている人をかなり見てきましたが、重要なのは、共有ライブラリが /MT フラグでビルドされている場合、共有ライブラリをリンクしてはならないことを実際に理解することです。/MD はまったく問題ありません。

ここに私が見つけたスレッドがあります: http://qt-project.org/forums/viewthread/16513

乾杯!

于 2012-06-14T10:58:18.467 に答える