「常に」スタックに置かれるべき非QObjectのは、クラスを派生しましたか?

StackOverflow https://stackoverflow.com/questions/3412579

質問

Symbianの世界から来て、私は、ディスクリプタを扱う場合は特に、スタック領域の不足を避けるためにできる限りのヒープを使用することに慣れています。 CBaseは、彼らがいなかった場合、そのメンバ変数が初期化されていないとどまるので、クラスは常に動的に、ヒープ上に割り当てられた派生しました。同じ規則はQObjectの派生クラスに適用されますか。

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

役に立ちましたか?

解決

sje397が言ったように:それは彼らが暗黙のうちに共有されているとして、スタック上QStringとコンテナを置くために慣用的です。彼らの内部(PIMPLイディオム「D」のポインタ)がヒープ上に作成されます。あまりにも、ヒープ上のオブジェクト自体を作成しても意味がありません。ただ、メモリ管理口論の原因となり、周りの文字列/コンテナへのポインタを渡すとき、あなたが意図したコピー・オン・ライト特性を失うます。

あなたがそうでなければ、彼らはすぐに再び破壊されるように、ほぼすべてのケースでヒープ上に作成する一方、

QObjects。彼らは、コピーまたは割り当てられた(まあ、1は自分のサブクラスのためにそれを強制することができますが、QObjectセマンティクスは、その後壊れている)、そして通常、彼らはそれらが作成されたメソッド本体を生き残ることになっていることはできません。 例外は、多くの場合、スタック上に作成したダイアログが閉じられるまでブロックQDialog、続いてQDialog::exec、です。外部イベント(RPC呼び出し、バックグラウンド処理)が(親自体が削除されている場合)のexec戻る前に、親によって削除されるダイアログを引き起こす可能性があるとして、しかし、たとえそれが厳密に、危険な話されています。 >クラッシュ - スタックをアンワインドするとき、スタック上で作成したダイアログを有する二重欠失の原因となります。

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top