1

私はQVector<QSharedPointer<SomeData> > DataVec、大きなオブジェクト指向プロジェクトの 1 つのクラスのフィールドとして持っています。QSharedPointers によって制御される大きなメモリが割り当てられているコード部分のサイクル実行中に、プログラムでメモリ オーバーフローが発生します。

プログラムの実行サイクル中にDataVec

DataVec.push_back(QSharedPointer<SomeData>(new SomeData()));

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().

4

1 に答える 1