CLion 在创建 Qt 布局时显示内存泄漏警告

问题描述 投票:0回答:1

我的

mainwindow.cpp
中有这个(最小示例)代码:

MainWindow::MainWindow(QWidget *parent) :
    QWidget(parent) {
    setWindowTitle("Drawing Window");
    setFixedSize(800, 600);
    
    auto *layout = new QVBoxLayout(this);
    auto *hlayout = new QHBoxLayout();
    
    // Create the Button
    button = new QPushButton("Load Image", this);
    button->setGeometry(10, 10, 80, 30);
    
    // Create the drawing area
    drawingArea = new QLabel(this);
    drawingArea->setFixedSize(512, 512);
    
    hlayout->addStretch(1);
    layout->addWidget(button);
    hlayout->addWidget(drawingArea);
    hlayout->addStretch(1);
    layout->addLayout(hlayout);
    layout->addStretch(1);
}

main.cpp

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MainWindow window;
    window.show();
    return app.exec();
}

据我了解,由于父子关系,Qt 应该自行处理布局的内存。

但是:CLion 在以下行中显示警告

Allocated memory is leaked

auto *layout = new QVBoxLayout(this);
auto *hlayout = new QHBoxLayout();

使用 Valgrind 运行此代码,我收到以下警告:

Leak_DefinetlyLost - 2 Warnings
Leak_PossiblyLost - 136 Warnings
UninitCondition - 209 Warnings

我的代码有问题吗?我应该在析构函数中删除我的布局吗?为什么? Qt 不帮我处理这个吗?

c++ qt valgrind qlayout
1个回答
0
投票

根据 Nate 爵士的建议,我们可以发现在您的示例中

layout
没有父级。 这里的问题是

QMainWindow 对象带有自己的自定义布局,在实际主窗口上设置布局,或创建以主窗口作为父窗口的布局,都被视为错误。您应该始终在中央小部件上设置自己的布局。

Qt 官方菜单示例中名为“MainWindow 类实现”的部分所述。

因此,当您使用

QVBoxLayout
参数创建
this
时,它会失败。

为了实现正确的内存管理,您应该为主窗口创建并设置一个中央小部件,然后将

layout
添加到其中。您还可以在上面的链接中找到代码示例。

© www.soinside.com 2019 - 2024. All rights reserved.