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必须使用动态内存分配?
这不是必需的.这里有典型的范围问题.
第一种情况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(...),除非您想要除了内存管理以外的其他内容,否则不需要父子关系.见下面的评论.
| 归档时间: |
|
| 查看次数: |
220 次 |
| 最近记录: |