問題タブ [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を正しい方法で削除するにはどうすればよいですか
私はQVector<QSharedPointer<SomeData> > DataVec
、大きなオブジェクト指向プロジェクトの 1 つのクラスのフィールドとして持っています。QSharedPointers によって制御される大きなメモリが割り当てられているコード部分のサイクル実行中に、プログラムでメモリ オーバーフローが発生します。
プログラムの実行サイクル中にDataVec
、
QSharedPointer
呼び出し後に削除(解放)されますDataVec.pop.back()
か?DataVec.clear()
違うと思う。明示的にデストラクタを呼び出す必要がありますQSharedPointer
(Qt の boost::shared_ptr::reset() のようなメソッドも表示されません)。関係するインスタンスへのポイントSomeData
がなくなると、デフォルトのデストラクタ (SomeData はフィールドとして標準の Qt コンテナのみを持つ) が呼び出され、メモリが解放されます。今、私はするだけです: どうやら、解放されていないデータへのポインターを失っているようです (実行後、valgrind はブロックを確実に失ったことを示しており、それらはここから発生したと思います)。QSharedPointers
SomeData
pop_back()
それで、最後に、私は正しいですか?また、コンテナから正しい方法で削除するにはどうすればよいQSharedPointer
ですか?
編集 1: Qt の boost::shared_ptr::reset() のようなメソッドはQSharedPointer::clear()
.
c++ - QSharedPointer::create()
Qt 4では、次の配列があります:
新しい Qt 5 create 関数を使用して、2 つの割り当てを 1 つに結合するにはどうすればよいですか?
c++ - 生のポインターからの QSharedPointer
現在、次のようなものがあります。
これで、 foo への生のポインターとrawfoo
. どうすればfooポイントが生のポインタを所有し、それを指し始めることができますか. boost::make_shared
共有ポインターを使用したブーストで、どのように使用できるか知っていQSharedPointer
ますか?
私はこのようなことをしたい:
c++ - QList および QSharedPointer で参照される要素へのアクセス
m_noteList
クラス の QSharedPointer 要素を含むという名前の QList メンバー変数がありますNote
。
新しいメモが作成されると、その参照がリストに追加されます。
ポインタが m_noteList にある Note 要素ごとに、そのタイトルを取得してコンテキストメニューに追加したいと考えています。目的は、そのタイトルをクリックしてメモを開くことです。
エラーが発生する
基本的に、で参照されているオブジェクトにアクセスしたいと考えていますm_noteList
。それ、どうやったら出来るの?m_noteList[i]
私はその要素にアクセスすることを考えましたが、明らかにコンパイラは type の何かを期待していQSharedPointer
ます。なんで?
c++ - スタック上の QSharedPointer を割り当てて関数から返す
愚かなポインターとは異なり、QSharedPointer
関数内のスタック上に を作成し、それを同じ型の別の型への代入の戻り値として返すことができると思いQSharedPointer
ますよね? 通常、そのようなポインターは現在スコープ外のメモリを指しているため、ポインターは有効ではありませんが、QSharedPointer
別のコピーが残っている場合は確実にメモリーに保持されると思います。これは正しいです?
c++ - QObject インスタンスのプール
解決方法がわからない問題が発生しました..
汎用オブジェクト プールがあります。オブジェクトが要求されると、プールはQSharedPointer
、カスタム Deleter が指定された状態で、最初に使用可能なインスタンスに戻ります。QSharedPointer
インスタンスの参照カウントが 0の場合、デリータはオブジェクトをプールに返すだけです。プレーンなオブジェクトの場合はすべて正常に機能します。QObject
Qt 5 でコンパイルすると、後継者に対しても正常に動作します。
ただし、Qt 4.6 でコンパイルすると、問題が発生します。同じオブジェクトが 2 回目に要求されると、アプリケーションはエラーで終了します。
「QSharedPointer: ポインター xxx には既に参照カウントがあります」
簡単なテストを書きました:
Qt 4.6でコンパイルすると、これは確かに失敗します。繰り返しますが、QT 5.x では正常に動作します。
Qt ソース コードを調べるとQObject
、これがパラメーターQObject
として使用されると、 4.6 が内部参照カウンターを初期化することが明らかになりました。QSharedPointer
これは、2 つのスマート ポインターが同じオブジェクトを指すことがないようにし、デストラクタでのみリセットされるようにするために行われます。
QObject
インスタンスがスマート ポインターにラップされている場合、Qt5 は参照カウンターの値をチェックしないため、機能します。
古い Qt バージョンの回避策を知っている人はいますか? refカウンターを含む内部Qtステータスを完全にリセットする方法はありますか? どんなヒントでも大歓迎です。