問題タブ [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++ - QSharedPointerでウィンドウを使用しているときにセグメンテーション違反が発生するのはなぜですか?
Qt 4.7.4(64ビット)を使用してGUIプログラムを開発しています。私は次のように問題を切り分けようとしました:
私はウィンドウを持っています:class PreferencesWindow : public QMainWindow
そして別のクラスで私はそれを初期化して次のように表示します
それはすべて良いです、そして私はウィンドウESC
のボタンを押すかクリックすることによってウィンドウを閉じx
ます。そして、私は電話します
プログラム全体を終了します。終了しますが、終了する直前にセグメンテーション違反が発生します。
ここでの問題は、代わりに通常のポインタを使用すると、なぜそれがきれいに終了するの か、そしてこの場合に適切にQSharedPointer
使用する方法ですか?QSharedPointer
c++ - QSharedPointer、それらを渡す方法、およびそれらが必要ですか?
数日間共有ポインタを理解しようとしていて、理解できないようです。当たり前のことなのか、複雑すぎるのかわからない。まず、共有ポインタを実際に使用する例を教えてください。ウィキペディアの例は私には意味がありません。また、共有ポインターを別の関数に渡す方法や、共有ポインターを使用してオブジェクトを作成する方法を教えてください。それで、どのようにそれを回し、どこでそれを使用しますか?どんな情報や例でも素晴らしいでしょう。
また、何を使用すればよいかわからないという問題があります。この関数を使用して、を割り当て、QFile
それを別のクラスの関数に渡します。この関数は、ファイルをとして受け取り、ファイルをQIODevice*
含むオブジェクトを作成します。私はここで最良の解決策は何であり、(もし私がそうすべきなら)ここで共有ポインタをどのように使用するのか疑問に思いましたか?<QFile>
で共有ポインタを作成し、関数が取る場所に渡すにはどうすればよいですか<QIODevice>
。共有ポインタをまったく取得していないように感じます...
QFile
私の他のアプローチは、の割り当てをに入れることQScopedPointer
です。次に、それをクラスに渡し、ファイルが保存されるオブジェクトを作成するときに、QPointer
またはを使用しますQScopedPointer
。最初の呼び出し関数の最後に、take()を呼び出す必要がありますか?
したがって、ポインタを格納する方法と、「new」が例外をスローした場合に作成中にポインタを処理する方法が必要です。
c++ - 共有ポインタと QSharedPointer::data() vs shared_ptr::get() を一般化しますか?
や などの長年の抽象化に基づいて構築された Qt ライブラリを作成しました。したがって、通常の共有ポインターが必要な場合は、一貫性を保つために使用するのが理にかなっています。QSharedDataPointer
QSharedData
QSharedPointer
現在、これを C++11 プロジェクトで使用しています。shared_ptr
コードをより標準的なものにするために、すべてのローカル サブシステムを に切り替えます。
ライブラリ自体の C++11 依存関係は必ずしも望ましいものではないため、使用する共有ポインターの種類を選択できるようにする必要があるように感じました。先に進むための最初のカットとして、C++0x でのテンプレート エイリアスの柔軟性で提案されているこの方法を試しました (確かに C++11 への依存自体ですが、非 C++11 ではコンパイラ フラグを介してプリプロセッサを使用できます)。ビルド)
残念ながら、ポインタ クラスはメソッドに別の名前を付けました。特に、含まれているポインターへのアクセスは.get()
、shared_ptr および.data()
QSharedPointer によって行われます。
私はある種のエクストラクタを作成するつもりでしshared_ptr_type_get<>
たが、同じことを効果的に達成できることに気付きました (含まれているポインタが null ではなく、ブール型強制によって null をテストできる場合)。
コードを読んでいると、ちょっとしたスピード バンプになります。しかし、WTF 要因を除けば、それは十分に害がないように思えます...そうですか?
c++ - boost::shared_arrayに相当するQtスマートポインタ?
boost::shared_ptr
( ) に相当するものは存在QSharedPointer
しますが、 に似ているものを見つけることができませんでしたboost::shared_array
。
もちろん、私は似たようなものを使うことができます
の代わりに提供して使用するネイティブQt ソリューションが存在するかどうかを知りたいです。ターゲットマシンにブーストをインストールできず、プロジェクトがソースごとに配布されるため、このプロジェクトでブーストを使用するのは気が進まない.T& operator[](size_t)
delete[]
delete
注: を使用してデリータを指定できることはわかっていますがQSharedPointer::QSharedPointer ( T * ptr, Deleter deleter )
、コンパイラはデリータを指定することを強制しないため、このアプローチは嫌いです。これにより、new []
割り当てられたブロックが によって削除されdelete
ます。
c++ - QSharedPointer と QObject::deleteLater
QSharedPointer
管理対象オブジェクトがその目的を終了し、すぐに削除の準備ができていることを通知する状況があります (実行後、readyForDeletion
シグナルを発する関数を離れた後)。通常のポインターを操作するときQObject::deleteLater
は、オブジェクトを呼び出すだけですが、QSharedPointer
マネージド インスタンスではこれができません。私の回避策は次のとおりです。
これはうまく機能しますが、この方法を使用すると多くのオーバーヘッドが生じます (新しいものを割り当てるQObject
など)。このような状況を処理するためのより良い解決策はありますか?
c++ - QSharedPointerの設定
私はC#のバックグラウンドを持っていますが、C++とQtのスマートポインターに頭を悩ませています。これは基本的な質問です。
myClass.hで
myClass.cppで、m_flagsポインターを設定しようとしています(正しい単語が設定されていますか?)
コンパイラは「'operator='に一致しません。で」と文句を言います。ポインタを設定するにはどうすればよいですか?
c++ - 2 つの QSharedPointer のデータが等しいことを確認する
2 つの QSharedPointer があります。このようにoperator==を使用して、それらが同じオブジェクトを指しているかどうかを確認できますか?
または私は書かなければなりません
ポインターに格納されているオブジェクトは、operator== をオーバーロードしています。
c++ - Pimpl + QSharedPointer - デストラクタ = 災害
昨日、私は悲惨な目に遭い、24 時間もフラストレーションを感じていました。問題は、ランダムに発生する予期しないクラッシュに要約されました。さらに複雑なことに、デバッグ レポートにも完全にランダムなパターンがありました。さらに複雑なことに、すべてのデバッグ トレースがランダムなQt ソースまたはネイティブ DLL のいずれかにつながっていました。
以下に、素敵なレポートの例をいくつか示します。
ご覧のとおり、これは非常に厄介なものであり、有用な情報はありません。ただ、一つ気になった点がありました。これはコンパイル中の奇妙な警告であり、目で捉えるのも困難です。
実際、私は最後の手段としてのみこの警告に目を向けました。なぜなら、バグを見つけるための必死の追跡において、コードはすでに文字通りログに感染していたからです。
それを注意深く読んだ後、たとえば、std::unique_ptr
またはstd::scoped_ptr
for Pimplを使用する場合、確実にデストラクターを提供する必要があることを思い出しました。そうしないと、コードはコンパイルさえしません。std::shared_ptr
ただし、デストラクタを気にせず、それがなくても問題なく動作することも覚えています。この奇妙な警告に注意を払わなかったもう 1 つの理由がこれでした。簡単に言えば、デストラクタを追加すると、このランダムなクラッシュが停止しました。QSharedPointer
に比べて、Qtにはいくつかの設計上の欠陥があるようstd::shared_ptr
です。Qt 開発者がこの警告をエラーに変換した方がよいと思います。なぜなら、このようなマラソンのデバッグは、時間、労力、および神経に値するものではないからです。
私の質問は次のとおりです。
- 何が問題なの
QSharedPointer
ですか? なぜデストラクタは非常に重要なのですか? - デストラクタがないのにクラッシュしたのはなぜですか? これらのオブジェクト ( Pimpl +を使用している
QSharedPointer
) はスタック上に作成され、他のオブジェクトはそれらの死後にそれらにアクセスできなくなります。しかし、クラッシュは彼らの死後、ランダムな期間に発生しました。 - 誰もそのような問題に遭遇したことがありますか? あなたの経験を共有してください。
- Qt にそのような他の落とし穴がありますか?
願わくば、これらの質問と私の投稿全般が、私が過去 24 時間にわたって経験した地獄を他の人が回避するのに役立つことを願っています。
qt - QSharedPointerdynamicCastとobjectCastがubuntuで失敗する
Ubuntu10.04でQt5.0.1を使用していますが、アプリケーションでは、実行時にQSharedPointerを適切なdynamic_cast(object_cast)変換と一緒に使用する必要があります。これらの変換は、実行時に適切にロードされる共有オブジェクトで呼び出されます。Ubuntu 10.04オペレーティングシステムを搭載した組み込みコンピューターで実行するには、アプリケーションをデプロイする必要があります。そのため、Ubuntu10.04でQtを使用しています。
アプリケーションをビルドし、Qtライブラリがインストールされているのと同じマシンで実行すると、すべてが期待どおりに機能します。
ただし、組み込みコンピューターでアプリケーションを実行すると、qSharedPointerDynamicCast(および同様のQSharedPointer :: dynamicCast、qSharedPointerObjectCast、QSharedPointer :: objectCast)が失敗し、nullポインターが返されます。両方のマシンの構成が同じであることを確認しました。dynamic_cast/object_castの問題を除いて、すべてが正常に機能しているようです。
これはRTTIの問題かもしれないと思いますが、徹底的にグーグルした後、問題の解決策が見つかりませんでした。