为什么关于 Qt 库的官方示例和教程从不使用智能指针?我只看到 new
和 delete
用于创建和销毁小部件。
我搜索了基本原理,但找不到,我自己也没有看到,除非是出于历史原因或向后兼容性:不是每个人都希望程序在小部件构造函数失败时终止,并通过以下方式处理它try/catch block 很丑(即使在少数地方使用)。父小部件可能拥有子小部件的事实也只是部分地向我解释了这件事,因为您仍然必须在某种程度上为父小部件使用 delete
。
最佳答案
因为 Qt 依赖于父子模型来管理 Qobject 资源。它遵循复合+责任链模式,从事件管理到内存管理、绘图、文件处理等……
实际上,尝试在共享\唯一指针中使用 QObject 是过度工程(99% 的时间)。
- 您必须提供一个自定义删除器,该删除器将调用 deleteLater
- 您的 qobject 与父对象已经在父对象中有引用。因此,您知道只要父对象存在,对象就不会泄漏。当您需要摆脱它时,您可以调用
deleteLater
直接。 - 您没有父级的 QWidget 已经有一个 reference in the Qapplication object .与第 2 点相同。
也就是说,您仍然可以将 RAII 与 Qt 一起使用。例如 QPointer在 QObject
上表现为弱引用.我会使用 QPointer<QWidget>
而不是 QWidget*
.
注意:不要听起来太狂热,两个词:Qt + valgrind。
关于c++ - 为什么官方的 Qt 示例和教程不使用智能指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34433435/