setParent(&wi-6ren">
gpt4 book ai didi

c++ - Qt如何删除QObjects?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:41:56 25 4
gpt4 key购买 nike

据我了解,以下代码是创建 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com