c++ - Qt如何删除QObjects?

标签 c++ qt qt4

据我了解,以下代码是创建 QObject 的完美方式

QLabel *label = new QLabel("label");
QWidget window;
label->setParent(&window);
window.show();

当我在无处不在阅读时,“父对象获得了新创建对象的所有权——并最终调用了删除”,或者“复合对象获得了子对象的所有权,因此,只要父类拥有完成后,您可以放心,当父级被销毁时,子 QObjects 将被销毁”(来自 How does Qt delete objects ? And what is the best way to store QObjects?)

有人能告诉我 Qt 如何“取得”QObject 的所有权吗?更技术性的:Qt(它是一个库并且有自己的运行时)如何在我用操作符 new 创建的指针上调用操作符 delete 来自不同的运行?为什么它没有崩溃?

编辑

我正在添加此引用,因为问题的全部要点来自于此:

“DLL 中运行的代码可能使用不同的 C++ 运行时库,这意味着堆的布局将不同。DLL 可能使用完全不同的堆。

在 DLL 分配的指针上调用 delete(在主程序中)(反之亦然)将导致(最好的​​情况)立即崩溃或(最坏的情况)内存损坏,这需要一段时间才能找到。 “(来自 C++ mix new/delete between libs?)

最佳答案

让源代码说话,而不是仅仅回答。这是QObject's internals做:

for (int i = 0; i < children.count(); ++i) {
    currentChildBeingDeleted = children.at(i);
    children[i] = 0;
    delete currentChildBeingDeleted;
}
children.clear();

上面代码的函数在析构函数中被调用。所以,这很简单。父级存储指向其所有子级的指针。当调用父级的析构函数时,它会删除所有子级。这是递归的,因为在对象上调用 delete 会调用它的析构函数

为什么Qt可以安全删除而不用担心运行时库

实际上,由于名称修改,导出 C++ 接口(interface)几乎迫使您使用相同版本的编译器和运行时库。这种非常粗略的方式允许 Qt 假设 delete 可以安全调用。

关于c++ - Qt如何删除QObjects?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50736201/

相关文章:

c++ - 特定快捷方式不适用于 QT

c++ - 如何使用 QT 命名空间中使用的重载 new 运算符

c++ - 使用 glTextCoordPointer 贴花纹理

qt4 - 如何使 QImage 或 QPixmap 半透明 - 或者为什么 setAlphaChannel 过时?

qt - 在 Qt 中,如何在菜单中显示键盘快捷键但禁用它们?

c++ - Curiously Recurring Template Pattern (CRTP)、AutoLists 和 C++

c++ - 如何使用 std::map 在 C++ 中检索 std::vector<int>?

c++ - 字符数组输出不正确

c++ - 表格 View 搜索

c++ - 在 QPixmap 上使用 QPainter 时应用程序崩溃