2011-12-17 12 views
0

は、私はクラスのメンバを持っている:QSetの各(ポインタ)要素を手動で削除する必要がありますか?

QSet<QDialog*>* dialogs_; 

は、私はちょうどdialogs_または私は同様にそれの各要素に対して削除呼び出す必要があります削除する必要がありますか?

+0

あなたは、いくつかのコンテキストを提供する必要があります。あなたのクラスが 'dialogs_'を' NULL'に初期化した後に 'no'を初期化するだけなら、何も' delete'する必要はありません。それは別のことをしますか?私たちは知らない、あなたは私たちに語っていない。 –

答えて

0

最初にセットを反復し、その中のすべてのオブジェクトを削除してから、セットオブジェクトを削除します。

しかし、Qtには独自のメモリ管理があり、そのセットを削除してQtのメカニズムによってオブジェクトが破壊されたままにしておくとよいでしょう。

+0

私は今Qtを使っていませんが、親オブジェクトに 'QDialog'などのui要素を渡すと、そのオブジェクトは子UI要素のメモリ管理を担当するようになります。私にそれを引用しないでください。 –

+0

@ChrisPartonしかし、あなたが子供を削除すると、qtシステムはそれを登録します。 [this](http://stackoverflow.com/questions/2491707/memory-management-in-qt)および[this](http://developer.qt.nokia.com/doc/qt-4.8/objecttrees)を参照してください。 html) –

1

はい、QDialogを手動でそれぞれdialogs_に削除する必要があります(ある場合)。

QSetdeleteで手動で繰り返し処理することができます。 QDialogQWidgetから継承されているため、別の方法では、フリーストアにも親が割り当てられている場合は、deleteすべてのダイアログの親となります。deleteです。

フリーストアにQSetを割り当てる理由はありません。これが実行している場合です。 new/deleteの操作は、クラスの直接のメンバーにするだけで保存できます。

QSet<QDialog*> dialogs_; 

これは、w.r.tを気にする必要がないことです。手動削除。これは、トリックを行います

2

qDeleteAll(*dialogs_); 
delete dialogs_ 

あなたは間接参照せずに、それをも行うことができます。

qDeleteAll(dialogs_->begin(), dialogs->end()); 
delete dialogs_ 
関連する問題