1. ホーム
  2. c++

[解決済み] なぜQtの公式サンプルやチュートリアルはスマートポインタを使用しないのですか?

2023-06-13 06:01:35

質問

Qt ライブラリの公式なサンプルやチュートリアルは、なぜスマートポインタを使用しないのでしょうか? 私が目にするのは newdelete で、ウィジェットの生成と破棄を行います。

ウィジェットのコンストラクタが失敗したときにプログラムが終了することを誰もが望んでいるわけではなく、try/catch ブロックでそれを処理することは (たとえ少数の場所で使用されていたとしても) 醜いだけです。親ウィジェットが子ウィジェットの所有権を取得する可能性があるという事実も、私には部分的にしか説明できません。 delete を使用する必要があるからです。

どのように解決するのですか?

QtはQobjectのリソースを管理するために親子モデルに依存しているからです。これは、イベント管理からメモリ管理、描画、ファイル処理などに使用される、複合型 + Chain-of-responsibility パターンに従っています...

実際に、QObjectを共有一体型ポインターで使おうとすると は過剰なエンジニアリングです。 (99%の確率で)です。

  1. deleteLater を呼び出すカスタムデレタを提供する必要があります。
  2. 親を持つqobjectは、すでに親オブジェクトへの参照を持っています。そのため、親が存在する限りオブジェクトはリークされないことが分かります。それを取り除く必要があるとき、あなたは deleteLater を直接呼び出すことができます。
  3. 親を持たないあなたのQWidgetは、すでに を参照しています。 . だから、ポイント2と同じです。

とはいえ、QtでRAIIを使うことは可能です。例えば QPointer の弱い参照として振る舞います。 QObject . 私なら QPointer<QWidget> よりも QWidget* .

note: あまりファンボーイに聞こえないように、2つの単語を。Qt + valgrindです。