問題タブ [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.

0 投票する
1 に答える
5042 参照

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 はブロックを確実に失ったことを示しており、それらはここから発生したと思います)。QSharedPointersSomeDatapop_back()

それで、最後に、私は正しいですか?また、コンテナから正しい方法で削除するにはどうすればよいQSharedPointerですか?

編集 1: Qt の boost::shared_ptr::reset() のようなメソッドはQSharedPointer::clear().

0 投票する
1 に答える
3813 参照

c++ - QSharedPointer::create()

Qt 4では、次の配列があります:

新しい Qt 5 create 関数を使用して、2 つの割り当てを 1 つに結合するにはどうすればよいですか?

0 投票する
2 に答える
3029 参照

c++ - 生のポインターからの QSharedPointer

現在、次のようなものがあります。

これで、 foo への生のポインターとrawfoo. どうすればfooポイントが生のポインタを所有し、それを指し始めることができますか. boost::make_shared 共有ポインターを使用したブーストで、どのように使用できるか知っていQSharedPointerますか?

私はこのようなことをしたい:

0 投票する
1 に答える
3030 参照

c++ - QList および QSharedPointer で参照される要素へのアクセス

m_noteListクラス の QSharedPointer 要素を含むという名前の QList メンバー変数がありますNote

新しいメモが作成されると、その参照がリストに追加されます。

ポインタが m_noteList にある Note 要素ごとに、そのタイトルを取得してコンテキストメニューに追加したいと考えています。目的は、そのタイトルをクリックしてメモを開くことです。

エラーが発生する

基本的に、で参照されているオブジェクトにアクセスしたいと考えていますm_noteList。それ、どうやったら出来るの?m_noteList[i]私はその要素にアクセスすることを考えましたが、明らかにコンパイラは type の何かを期待していQSharedPointerます。なんで?

0 投票する
2 に答える
1396 参照

c++ - スタック上の QSharedPointer を割り当てて関数から返す

愚かなポインターとは異なり、QSharedPointer関数内のスタック上に を作成し、それを同じ型の別の型への代入の戻り値として返すことができると思いQSharedPointerますよね? 通常、そのようなポインターは現在スコープ外のメモリを指しているため、ポインターは有効ではありませんが、QSharedPointer別のコピーが残っている場合は確実にメモリーに保持されると思います。これは正しいです?

0 投票する
2 に答える
1182 参照

c++ - QObject インスタンスのプール

解決方法がわからない問題が発生しました..

汎用オブジェクト プールがあります。オブジェクトが要求されると、プールはQSharedPointer、カスタム Deleter が指定された状態で、最初に使用可能なインスタンスに戻ります。QSharedPointerインスタンスの参照カウントが 0の場合、デリータはオブジェクトをプールに返すだけです。プレーンなオブジェクトの場合はすべて正常に機能します。QObjectQt 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ステータスを完全にリセットする方法はありますか? どんなヒントでも大歓迎です。