4

したがって、トピック行に記載されているコードにより、Qt4.8.3およびgcc4.7.2でセグメンテーション違反が発生します。

これは.cpp-fileのクラス/構造体の外部にあり、gcc4.4で動作します

const QList<int> warnings = QList<int>() << 0 << 3 << 7;

トレースは、次の2つのヒントを提供します。

__do_global_ctors()
__static_initialization_and_destruction_0

したがって、後者のリストを挿入する場合、「警告」はまだ利用できないようです。

これに変更すると4.7.2で動作します:

global scope: QList< int> warnings;

これはいくつかの機能です:

warnings = QList<int>() << 0 << 3;

なぜこれが起こるのだろうか?

編集:

私はもともと私の質問から少し多くのものを切り取ったと思いますが、警告は束の列挙型を保持するためのファイルスコープ(.cpp-file)で一定であると思われます。

4

1 に答える 1

6

私の精神的なデバッグ能力は、問題の行がクラス/関数スコープではなく、グローバル/ファイルスコープに存在することを教えてくれます。したがって、静的初期化中の任意の時点で回線が呼び出される可能性があります。古いgccでは、ラインが呼び出される前にQTが初期化されたことがありました。新しいgccを使用すると、QTがオブジェクトを作成してオブジェクトに挿入する準備が整う前に、静的initを(完全に合法的に)並べ替えて、最初に関数を呼び出します。

QList解決策は、開始後までそれを作成することを延期することmainです。ポインタまたは静的ローカルオブジェクトの使用は、2つの一般的な実装です。

于 2012-11-07T14:42:06.120 に答える