「常に」スタックに置かれるべき非QObjectのは、クラスを派生しましたか?
-
26-09-2019 - |
質問
Symbianの世界から来て、私は、ディスクリプタを扱う場合は特に、スタック領域の不足を避けるためにできる限りのヒープを使用することに慣れています。 CBaseは、彼らがいなかった場合、そのメンバ変数が初期化されていないとどまるので、クラスは常に動的に、ヒープ上に割り当てられた派生しました。同じ規則はQObjectの派生クラスに適用されますか。
でQtはスタック上に、例えばQStringのために、置くのが一般的のようです。 QStringのは、スタック上のコンテナとして機能しながら、文字列の内容は、ヒープ上に置かれ、またはすべてがスタックに置かれていますか?
解決
sje397が言ったように:それは彼らが暗黙のうちに共有されているとして、スタック上QString
とコンテナを置くために慣用的です。彼らの内部(PIMPLイディオム「D」のポインタ)がヒープ上に作成されます。あまりにも、ヒープ上のオブジェクト自体を作成しても意味がありません。ただ、メモリ管理口論の原因となり、周りの文字列/コンテナへのポインタを渡すとき、あなたが意図したコピー・オン・ライト特性を失うます。
QObjects
。彼らは、コピーまたは割り当てられた(まあ、1は自分のサブクラスのためにそれを強制することができますが、QObject
セマンティクスは、その後壊れている)、そして通常、彼らはそれらが作成されたメソッド本体を生き残ることになっていることはできません。
例外は、多くの場合、スタック上に作成したダイアログが閉じられるまでブロックQDialog
、続いてQDialog::exec
、です。外部イベント(RPC呼び出し、バックグラウンド処理)が(親自体が削除されている場合)のexec戻る前に、親によって削除されるダイアログを引き起こす可能性があるとして、しかし、たとえそれが厳密に、危険な話されています。
>クラッシュ - スタックをアンワインドするとき、スタック上で作成したダイアログを有する二重欠失の原因となります。
他のヒント
QStringの、および他の多くのQtのクラスは、の暗黙的なデータ共有を使用します。すなわち、そのメモリは、一般的に、ヒープ上に割り当てられている意味します。