2016-09-22 5 views
0

QGraphicsSceneのすべてのアイテムを削除して削除します。このように、QGraphicsItemを削除するとクラッシュする

ただし、このコードブロックを実行してループから抜けた直後にセグメント化エラーが発生してクラッシュしました。デバッグモードでは、デバッガはアセンブリファイルにジャンプしました。 enter image description here どうしたらいいですか?

+0

'アイテムを削除する 'の代わりに' item-> deleteLater() 'を使用するとクラッシュしますか? – TheDarkKnight

+0

@TheDarkKnight - 問題のアイテムは 'QGraphicsItem *'タイプであり、 'QGraphicsItem'は' QObject'から継承しないので、このケースでは問題ではないと確信しています。それは確かにメモリ破損の味方です。 –

+1

私は 'deleteLater'に関してある程度コメントしています。表示されたコードがイベントハンドラのコンテキスト内で実行され、削除されたアイテムのうちの1つまたは複数が実際に 'QGraphicsObject'から派生した型のものである場合、' QObject :: deleteLater' *はそれらのアイテムに適しています。さもなければ、彼らはまだ保留中のイベントで削除されるかもしれません。また、すべてのアイテムを削除/削除する場合は、単純に['QGraphicsScene :: clear'](http://doc.qt.io/qt-5/qgraphicsscene.html#clear) –

答えて

0

シーンからすべてのアイテムを削除する場合は、以下のように「クリア」しないでください。 あなたにはあなたのシーンオブジェクトがあります。

scene-> clear();ドキュメントを1として

: 無効QGraphicsScene ::

を削除()をクリアし、シーンからすべての項目が削除されますが、それ以外のシーンの状態は変更されません。

この関数はQt 4.4で導入されました。

0

コードはわかりましたが、私はQGraphicsScene :: clearを使用するほうが意味があることに同意します。それは正確にこれを行うと私の推測より効率的です。

独自のQGraphicsItemオブジェクトを派生させた場合は、派生クラスのデストラクタで複数のメモリ削除をチェックしてください。どのオブジェクトが特定のポインタを所有しているかを混乱させることで、同じメモリを解放する2つの異なるアイテムが作成されます。

0

あなたはポインタを使用し、関数clearを使用するときは、それは娘のデストラクタを呼び出しますが、ポインタを使用するとすべてのポインタを破棄する必要があります。 foreachはイテレータを使用しているので、foreachを使用しないで単純なforループを試してください。削除した後はイテレータが無効だと思います。

for(int i=0; i < v.size(); ++i) 
{ 
    delete v[i]; 
    v[i] = nullptr ; 
} 
関連する問題