1

QGraphicsSceneからシーンを継承しました。このシーンに多くのアイテム(QGraphicslineItem、QGraphicsItem、QGraphicsTextItem)を追加します。QGraphicsSceneClearメソッドを試すと、リリースモードでクラッシュします。デバッグモードでは正常に動作します。

注:一部のアイテムには子アイテムがあるか、他のアイテムへのポインターがあるため、それらを削除すると、デストラクタで処理されます(他のアイテムへのポインターの削除など)。他のアイテムへのポインタがクラッシュするのではないかと思いますが、リリースモードでのみクラッシュする理由がわかりません。

リリースモードのコールスタックは役に立ちませんが、コンソールでのアクセス違反を示しています。

4

1 に答える 1

1

あなたの問題は、あなたのアイテムのいくつかが同じシーンの他のアイテムを削除していることです。clear()を呼び出すときに、アイテムを削除する順序を(直接ではなく)制御することはできません。アイテムA、B、およびCがあるとします。CはAとBの両方へのポインタを保持します。clear()が呼び出された場合、Cのデストラクタが呼び出されたときにAとBがすでに削除および削除されている可能性があります。

リリースモードでのみ発生するクラッシュに関しては、削除の順序はコンパイラの最適化のレベルによって異なる場合があります。これは、ダングリングポインタを扱うときに非常に一般的です。

于 2011-05-27T13:56:00.173 に答える