QGraphicsScene::clear() 方法仅在发布模式下崩溃
我从 QGraphicsScene 继承了我的场景。我在此场景中添加了许多项目(QGraphicslineItem、QGraphicsItem、QGraphicsTextItem)。每当我尝试 QGraphicsSceneClear 方法时,它都会在发布模式下崩溃。它在调试模式下运行良好。
注意:某些项目具有子项目和/或具有指向其他项目的指针,因此当我删除它们时,我会在析构函数中处理它们(删除指向其他项目的指针等)。我猜指向其他项目的指针会导致它崩溃,但我不明白为什么它只在发布模式下崩溃。
发布模式下的调用堆栈没有用,但它确实在控制台上显示访问冲突。
I inherited my scene from QGraphicsScene. I add many items(QGraphicslineItem, QGraphicsItem, QGraphicsTextItem) on this scene. Whenever i try QGraphicsSceneClear method it crashes on release mode. It works fine on debug mode.
Note: Some items have child items and/or have pointers to other items, so when i delete them i handle them in the destructor (deleting pointers to other items etc). i guess pointers to other items makes it crashing but i do not understand why it crashes only on release mode.
The call stack in release mode is not useful, but it does say access violation on the console.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您的问题是您的某些项目正在删除同一场景中的其他项目。调用clear() 时,您无法控制(好吧,不是直接)删除项目的顺序。假设您有 A、B 和 C 项。C 维护一个指向 A 和 B 的指针。当调用 clear() 时,在调用 C 的析构函数时,A 和 B 可能已经被移除和删除。
至于仅在发布模式下发生的崩溃,删除的顺序可能取决于编译器优化的级别。这在处理悬空指针时非常常见。
Your problem is some of your items are deleting other items in the same scene. You have no control (well, not directly) on the order of removal of items when calling clear(). Say you have items A, B, and C. C maintains a pointer to both A and B. When clear() is called, A and B may have already been removed and deleted when C's destructor is called.
As for the crash only happening in release mode, the order of removal may depend on the level of compiler optimization. This is really common when dealing with dangling pointer.