8

Qtのドキュメントによると:

QObjectは、オブジェクトツリーに編成されます。別のオブジェクトを親としてQObjectを作成すると、そのオブジェクトは自動的に親のchildren()リストに追加されます。親がオブジェクトの所有権を取得します。つまり、デストラクタ内の子を自動的に削除します。

私にとっては、QObjectが削除されるときに、子リストに格納されているすべてのポインターを通過してdeleteを呼び出すことを意味します。

ただし、子を動的に割り当てる必要はなく、スタックに割り当てられたオブジェクトを使用してQObjectツリーを構築することは完全に合法です。

標準仕様によれば、動的に割り当てられたオブジェクトを指さないポインタでdeleteを呼び出すことは未定義の動作であり、「何もない」からプログラムのクラッシュに至る可能性があります。

IMOは、QtクラスのほぼすべてのコレクションのバックボーンであるQObjectが、未定義の動作を生成する可能性のあるものに依存する可能性はほとんどありません。

では、QObjectは、削除時にスタックとヒープに割り当てられた子を区別しますか?もしそうなら、どのくらい正確に?

4

1 に答える 1

11

ただし、子を動的に割り当てる必要はなく、スタックに割り当てられたオブジェクトを使用してQObjectツリーを構築することは完全に合法です。

いいえ。QObject::〜QObject()を参照してください:

警告:すべての子オブジェクトが削除されます。これらのオブジェクトのいずれかがスタックまたはグローバルにある場合、遅かれ早かれプログラムはクラッシュします。

于 2012-09-20T13:52:56.360 に答える