問題タブ [qsharedpointer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 共有ポインターを介してメンバー関数を呼び出すコストはいくらですか?
スマート ポインターを逆参照しても、パフォーマンスに大きな影響はないとよく言われます。(例: C Smart Pointer Performance )
これが本当なのか今疑問に思っています。参照されているオブジェクトに対する操作がアトミックである場合、それが可能であることを理解しています。
このスニペットに基づいてコードを考える:
doWork()
永続的に実行され、時々setDataProvider()
2 番目のスレッドから呼び出されます。ごく普通のスマート ポインターの使用シナリオ。
一般的なコンセンサスではsetDataProvider()
、ロックで保護された参照カウントを変更する必要があるため、追加のコストがかかると言われていますが、そうでm_provider->getSomeData()
はありません。通常のポインター逆参照に匹敵すると言われていますが、少なくともコストのかかるロックは必要ありません。
しかし、それはどのように機能しますか?getSomeData()
はアトミック操作ではなく、いくつかのロジックと顕著な実行時間があると仮定しましょう。
*m_provider
実行中に削除されないようにするにはどうすればよいgetSomeData()
ですか? クラスがオブジェクトの唯一の所有者である可能性があります。上書きm_provider
すると、ポインターの参照カウントが 1 つ減少します。m_provider->getSomeData()
一時的に参照カウントを上げる必要があるか、実行中にオブジェクトが削除されないように保護されていますgetSomeData()
。
どちらの場合も、コストのかかる同期/ロック メカニズムが必要です。
補遺:shared_ptr
一般的にこれについて疑問に思っているので、例では標準を使用しました。ただし、実際のコードで使用されてQSharedPointer
いるため、これについて特に興味があります。どちらも同じスレッド セーフであると単純に想定していましたが、これは間違っている可能性があります。
c++ - Qt アプリケーションには自動ガベージ コレクションがありますか?
私はこれを研究していますが、決定的な答えはありません。Qt ウィジェット アプリケーションは、終了時にメモリをクリーンアップしますか? QObject に由来する違いはありますか? ガベージコレクションがある場合、なぜQSharedPointer
クラスがあるのですか? 私のコードの次のコンテキストから質問しています。
アプリケーションが終了すると、syncProcess
クリーンアップされますか? ユーザーが終了せずにこの関数を 1000 回呼び出した場合、メモリ リークが発生しますか?
アップデート
上記の関数が頻繁に何度も呼び出されることを考えるとQProcess
、メンバー変数を宣言する方が良いQSharedPointer
ですか、それとも上記のコードを改善するために使用するだけですか?
c++ - QList::QSharedPointer を含む
だから私は id データメンバーを持つクラスを持っていて、それを で使用していますがQList<QSharedPointer<MyClass>>
、その中に既存の id があるかどうかを確認する方法がわかりませんQList
。aではなく aQList::contains
を必要とするのとまったく同じように、どうすればよいでしょうか。QSharedPointer<MyClass>&
MyClass*
IDをキーとして使用するQHashを使用する必要がありますか?
c++ - QSharedPointer オブジェクトにアクセスするときのセグメンテーション違反
以下のような小さなサンプル アプリケーション コードを作成しました。
デバッグ メッセージを 2 回目に出力すると、セグメンテーション違反とアプリケーションのクラッシュが表示されます。QSharedPointer のドキュメントによると、要素にアクセスした後、初めてポインターを削除している可能性があります。
QSharedPointer nav = m->getINav(); が欲しい これは、私の実際のシナリオの問題に対する一種のダミー アプリケーションであるため、while ループ自体に入る必要があります。
これを機能させる方法がわかりません。助けていただければ幸いです。前もって感謝します。
c++ - QSharedPointers を値として Qmap を反復処理する
QSharedPointers を値として含む QMap があります。マップをループして結果を qDebug しようとするたびに、メモリ処理エラーが発生します。
マップの値は QObject を継承した Team クラスのオブジェクトです。
QMap 定義:
実装:
チームはコンテンツをマップします:
- ("Detroit", Team), // "デトロイト" を市区町村、"Joe Louis Arena" を競技場とするチーム オブジェクト。
- ("Pittsburgh", Team) // 都市としての "Pittsburgh" と "Mellon arena" というパラメーターを持つ Team オブジェクト。
qDebug の出力は次のとおりです。
「デトロイト」 - 「メロンアリーナ」
「」 - 「メロンアリーナ」
そこで何が起こるの?出力が正しいオブジェクトから都市を取得し、次のオブジェクトから面積を取得するのはなぜですか?
私はPythonのバックグラウンドから来ており、明らかにここでメモリが正しく処理されていません。しかし、私は例を検索しましたが、ここで何が間違っているのかわかりません。
マップからもキーを取得し、それを使用してマップから値を検索しようとしましたが、最初のループの後にプログラムがクラッシュします。
c++ - なぜ QSharedPointer は::不完全なオブジェクトの呼び出しデストラクタを作成しますか?
次のコード例があります。
上記のコードの出力は次のとおりです。
しかし、出力のある行のコメントを外すとstd::make_shared
、次のようになります。
では、なぜQSharedPointer::create
不完全なオブジェクトのデストラクタを呼び出すのでしょうか? それはバグですか、それとも何か不足していますか?
MSVC2013
+Qt 5.5.1
とMSVC2015
+ Qt 5.6
(ソースからビルド)で試してみました。結果は同じです。
c++ - Qt でどのメモリ管理方法を使用する必要がありますか?
私は効率的にコーディングする方法をまだ学んでいるので、プログラミングにはまったく慣れていないので、私の質問は少し奇妙に思えるかもしれません.
Qt でコーディングする方法を学んでいると、Qt にはメモリ管理メソッドがあり、それ自体が削除されたときに親がすべての子を削除し、QSharedPointer
他にも非常に多くのスマート ポインターがあることを知っています (または、言及することができますboost::shared_ptr
)。
私は両方の方法がどのように機能するかを正確に理解していますが、私の質問は、Qt のシステム構造全体の設計に関しては、クラスのほとんどをサブクラスにQObject
して、所有権を QT に渡してメモリ管理を行うべきか、またはメモリ リークの可能性を回避するために単にboost::shared_ptr
orを使用していますか?QSharedPointer
両方の手法を採用すると、二重削除の問題が発生する可能性があるため、考慮すべき問題がたくさんあります。
では、どちらの手法がより優れたパフォーマンスを発揮し、どちらが設計上優れているのでしょうか?