c++ - 为什么官方的 Qt 示例和教程不使用智能指针?

标签 c++ qt c++11

为什么关于 Qt 库的官方示例和教程从不使用智能指针?我只看到 newdelete 用于创建和销毁小部件。

我搜索了基本原理,但找不到,我自己也没有看到,除非是出于历史原因或向后兼容性:不是每个人都希望程序在小部件构造函数失败时终止,并通过以下方式处理它try/catch block 很丑(即使在少数地方使用)。父小部件可能拥有子小部件的事实也只是部分地向我解释了这件事,因为您仍然必须在某种程度上为父小部件使用 delete

最佳答案

因为 Qt 依赖于父子模型来管理 Qobject 资源。它遵循复合+责任链模式,从事件管理到内存管理、绘图、文件处理等……

实际上,尝试在共享\唯一指针中使用 QObject 是过度工程(99% 的时间)。

  1. 您必须提供一个自定义删除器,该删除器将调用 deleteLater
  2. 您的 qobject 与父对象已经在父对象中有引用。因此,您知道只要父对象存在,对象就不会泄漏。当您需要摆脱它时,您可以调用deleteLater直接。
  3. 您没有父级的 QWidget 已经有一个 reference in the Qapplication object .与第 2 点相同。

也就是说,您仍然可以将 RAII 与 Qt 一起使用。例如 QPointerQObject 上表现为弱引用.我会使用 QPointer<QWidget>而不是 QWidget* .

注意:不要听起来太狂热,两个词:Qt + valgrind。

关于c++ - 为什么官方的 Qt 示例和教程不使用智能指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34433435/

相关文章:

c++ - 我应该将什么设置为 _ITERATOR_DEBUG_LEVEL

c++ - 对于可 move 类型,删除 std::vector 中间的元素仍然很昂贵吗?

c++ - 如何检查 QProcess 是否正确执行?

C++ 半透明窗口 SDL

c++ - SHBindToParent,获取父 pidl

c++ - QT按钮更改其大小并剪切其中的文本

c++ - Visual Studio 中///<comment> </comment> 的用途是什么

python - 如何为 Python 2.7 安装 Pyside?

qt - 如何解压 QByteArray 中的 32 位整数?

c++ - 偏序可变参数模板函数 clang