c++ - 有利于限制 Qt 对象的范围吗?

标签 c++ qt

new 分配的 Qt 对象几乎已经为您处理好了。事情会在某个时候被清理(几乎总是在父对象被破坏时),因为 Qt 对象有一个很好的父子关系。

所以我的问题是:鉴于某些小部件在应用程序的生命周期内存在,限制某些子小部件的范围是否被认为是好的/有益的?在我看来,如果我不这样做,应用程序可能不会释放这些对象,直到应用程序退出。例如:

MyMainWindow::contextMenu(...) {
    QMenu *menu = new QMenu(this);
    // ...
    menu->exec();
}

对比:

MyMainWindow::contextMenu(...) {
    QMenu *menu = new QMenu(this);
    // ...
    menu->exec();
    delete menu;
}

对比:

MyMainWindow::contextMenu(...) {
    QScopedPointer<QMenu> menu(new QMenu(this));
    // ...
    menu->exec();
}

我最喜欢最后一个,我知道该菜单对象将被立即清理,无需添加任何需要担心的代码行。但是,在第一个中,它应该最终 被清理掉。我是否在浪费精力试图管理这些 Qt 小部件的生命周期?我应该完全将其留给 Qt 吗?

最佳答案

在你的第一个例子中,当这个(即 MyMainWindow 对象)是...时,菜单将被删除,这可能不是你想要的,因为这意味着如果 contextMenu() 被调用不止一次,多个看不见的旧 QMenu对象会在内存中堆积,如果用户长时间不关闭/删除 MyMainWindow,最终可能会耗尽大量 RAM。

你的第二个和第三个例子都很好。第三个可能稍微好一点,因为它避免了在没有调用删除的情况下引入错误的任何可能性。

关于c++ - 有利于限制 Qt 对象的范围吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1975951/

相关文章:

c++ - 如何快速释放包含动态分配内存作为值的映射?

c++ - 在对象构造函数中将子结构值设置为纯虚函数返回的值是否安全?

可以从类中设置的 C++ 只读结构?

qt - 安装Qt 5.6.1 MSVC 2015 Update 3

c++ - Qt:如何为 QLabel 创建清晰可见的发光效果? (例如使用 QGraphicsDropShadowEffect)

c++ - 使用函数指针在函数实现之间切换

c++ - 为什么线程清理器会提示这个 std::ranges::views::filter 代码?

c++ - 加载 DLL 是否会动态协调其 stderr 到主应用程序?如果是这样,那么如何......?

qt - 为什么我们应该总是从 Qt 中的基类派生?

c++ - 完全自定义 Qt Creator 编码风格?