【问题标题】:Pro and cons about creating QObjects components on the stack instead of creating them dynamically关于在堆栈上创建 QObjects 组件而不是动态创建它们的利弊
【发布时间】:2020-07-27 00:32:54
【问题描述】:

如果我在堆栈上分配 QObjects 以避免内存管理问题,会有什么问题吗?我应该更喜欢动态分配的 QObjects 并通过 qt 对象树及其所有权机制委托内存管理吗?

【问题讨论】:

    标签: c++ qt memory-management qobject


    【解决方案1】:

    除非它位于最顶层(例如,在您创建初始窗口时在 main 中),否则您真的不应该这样做。

    根本原因是 Qt 根本不是为自动对象设计的。 Qt 是围绕动态分配和为您管理内存而设计的,违反这一点可能会导致一些令人讨厌的结果。立即浮现在脑海的是自动对象的破坏顺序,自动对象的破坏顺序与它们的构造相反。那么在这种情况下会发生什么?

    ...
    QLabel lbl("Hello world");
    QWidget win;
    lbl.setParent(&win);
    ...
    

    答案并不漂亮。当这些对象被销毁时,win 将首先被销毁,它会调用lbl 的析构函数,不幸的是lbl 是一个自动对象(这意味着手动删除它是未定义的行为); win 之后它将被正确销毁,但到那时为时已晚。这只是一个示例,但它强调了一些奇怪的错误,如果您违反 Qt 的假设,即它为您管理您的内存,这些错误可能会发生。

    总体而言,与自动分配相比,动态内存分配的最小开销是值得的,以防止像上面那样难以追踪和奇怪的错误。 IMO,您应该始终让 Qt 为您管理您的内存,因为这就是它的设计方式,并且它假定您将使用它。

    【讨论】:

    • 谢谢,听说堆分配比堆栈分配更安全用于内存管理有点不寻常。但如果这是我们必须遵循的 qt 哲学。
    • 如果你不传递父节点,栈分配是安全的。对于像这样的情况QFile,这也是我推荐的。
    猜你喜欢
    • 2021-08-09
    • 2015-05-25
    • 2010-10-15
    • 2016-10-15
    • 2013-01-13
    • 1970-01-01
    • 2015-11-04
    • 2018-04-11
    • 2010-12-08
    相关资源
    最近更新 更多