5

Symbianの世界から来た私は、特に記述子を処理するときに、スタックスペースが不足しないように、可能な限りヒープを使用することに慣れています。CBase派生クラスは常にヒープに動的に割り当てられました。割り当てられていない場合、メンバー変数は初期化されないままになるためです。同じ規則がQObjectから派生したクラスにも適用されますか?

Qtでは、たとえばQStringをスタックに置くのが一般的であるようです。QStringがスタック上のコンテナーとして機能している間、文字列の内容はヒープに配置されますか、それともすべてがスタックに配置されますか?

4

2 に答える 2

10

sje397 が言ったように:QStringコンテナーは暗黙的に共有されるため、コンテナーをスタックに置くのは慣用的です。それらの内部 (pimpl イディオム "d" ポインター) はヒープ上に作成されます。オブジェクト自体をヒープ上に作成しても意味がありません。メモリ管理の手間が発生するだけで、文字列/コンテナーへのポインターを渡すときに、意図したコピーオンライト プロパティが失われます。

QObjects一方、ほとんどの場合、ヒープ上に作成する必要があります。そうしないと、すぐに再び破棄されます。それらをコピーしたり割り当てたりすることはできません (まあ、それを独自のサブクラスに強制することはできますが、その場合QObjectセマンティクスは壊れます)。通常、それらは作成されたメソッド本体に存続することになっています。例外はQDialogであり、多くの場合、スタックに続きQDialog::exec、ダイアログが閉じられるまでブロックします。しかし、外部イベント (RPC 呼び出し、バックグラウンド操作) によって、exec が戻る前に (親自体が削除された場合) ダイアログがその親によって削除される可能性があるため、それは厳密には安全ではありません。次に、スタックにダイアログを作成すると、スタックを巻き戻すときに二重削除が発生します -> クラッシュします。

于 2010-08-05T09:48:57.767 に答える
1

QString およびその他の多くの Qt クラスは、暗黙的なデータ共有を使用します。これは、通常、メモリがヒープに割り当てられることを意味します。

于 2010-08-05T07:34:04.357 に答える