[解決済み] なぜQtの公式サンプルやチュートリアルはスマートポインタを使用しないのですか?
2023-06-13 06:01:35
質問
Qt ライブラリの公式なサンプルやチュートリアルは、なぜスマートポインタを使用しないのでしょうか? 私が目にするのは
new
と
delete
で、ウィジェットの生成と破棄を行います。
ウィジェットのコンストラクタが失敗したときにプログラムが終了することを誰もが望んでいるわけではなく、try/catch ブロックでそれを処理することは (たとえ少数の場所で使用されていたとしても) 醜いだけです。親ウィジェットが子ウィジェットの所有権を取得する可能性があるという事実も、私には部分的にしか説明できません。
delete
を使用する必要があるからです。
どのように解決するのですか?
QtはQobjectのリソースを管理するために親子モデルに依存しているからです。これは、イベント管理からメモリ管理、描画、ファイル処理などに使用される、複合型 + Chain-of-responsibility パターンに従っています...
実際に、QObjectを共有一体型ポインターで使おうとすると は過剰なエンジニアリングです。 (99%の確率で)です。
- deleteLater を呼び出すカスタムデレタを提供する必要があります。
-
親を持つqobjectは、すでに親オブジェクトへの参照を持っています。そのため、親が存在する限りオブジェクトはリークされないことが分かります。それを取り除く必要があるとき、あなたは
deleteLater
を直接呼び出すことができます。 - 親を持たないあなたのQWidgetは、すでに を参照しています。 . だから、ポイント2と同じです。
とはいえ、QtでRAIIを使うことは可能です。例えば
QPointer
の弱い参照として振る舞います。
QObject
. 私なら
QPointer<QWidget>
よりも
QWidget*
.
note: あまりファンボーイに聞こえないように、2つの単語を。Qt + valgrindです。
関連
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] template "と "typename "キーワードはどこに、なぜ入れなければならないのですか?
-
[解決済み] マクロで無意味なdo-while文やif-else文を使っているのはなぜですか?
-
[解決済み】なぜC++コンパイラはoperator==とoperator!=を定義しないのでしょうか?
-
[解決済み】C++のRAIIとスマートポインタ
-
[解決済み] なぜC++のライブラリやフレームワークではスマートポインタが使われないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない