gpt4 book ai didi

c++ - 为什么我必须为 QLabel 动态分配内存才能工作?

转载 作者:太空宇宙 更新时间:2023-11-03 10:24:23 25 4
gpt4 key购买 nike

此代码不动态分配内存,不在窗口上显示任何标签。

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QLabel l;
l.setText ("cdsadsaf");
l.setParent (this);
}

动态分配内存后,标签显示出来。

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QLabel *label = new QLabel(this);
label->setText("first line\nsecond line");
}

为什么 QLabel 需要动态内存分配才能工作?

最佳答案

这不是必需的。你在这里有典型的范围问题。

第一种情况在堆栈上创建了 QLabel,当您退出构造函数时它“死掉”。

在第二个它继续存在 1) 因为它是动态分配的 2) 您实际上为它分配了一个父级 - 这是您的主窗口。如果您不执行 2),效果将与第一种情况相同,但更糟 - 您将造成内存泄漏:

内存泄漏

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QLabel *label = new QLabel(); # no parent
label->setText("first line\nsecond line");
}

没有由于将父级分配给标签而导致的内存泄漏

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QLabel *label = new QLabel(this); # main window is the parent and will take care of destroying the label when its own destructor is called
label->setText("first line\nsecond line");
}

您可以避免在堆上分配 QLabel,但仍然可以通过将它移动到更广泛的范围来使用它。由于您的标签要显示在主窗口中,因此您可以创建一个类成员标签。不需要动态分配,因为只要您的窗口实例处于事件状态,它就会一直存在。

class MainWindow : public QMainWindow
{
...
private:
QLabel l;
}

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
this->l.setText ("cdsadsaf");
}

正如评论中提到的(再次感谢!)setParent(...) 在这里不是必需的,除非您想要父子关系用于内存管理之外的其他事情。请参阅下面的评论。

关于c++ - 为什么我必须为 QLabel 动态分配内存才能工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43906782/

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