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

Aqu*_*irl 1 c++ qt dynamic-memory-allocation qlabel

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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QLabel l;
    l.setText ("cdsadsaf");
    l.setParent (this);
}
Run Code Online (Sandbox Code Playgroud)

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

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

为什么QLabel必须使用动态内存分配?

rba*_*dar 5

这不是必需的.这里有典型的范围问题.

第一种情况QLabel在堆栈上创建,当你退出构造函数时它会"死".

在第二个它继续生活1)因为它是动态分配的2)你实际上为它分配了一个父 - 这是你的主窗口.如果你不做2),效果将与第一种情况相同但更糟糕 - 你将创建一个内存泄漏:

内存泄漏

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

由于父项被分配给标签而没有内存泄漏

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");
}
Run Code Online (Sandbox Code Playgroud)

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

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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->l.setText ("cdsadsaf");
}
Run Code Online (Sandbox Code Playgroud)

正如评论中所提到的(再次感谢!)setParent(...),除非您想要除了内存管理以外的其他内容,否则不需要父子关系.见下面的评论.