該代碼不會動態分配內存,不會在窗口上顯示任何標籤。
這是因爲一旦從構造函數返回,標籤就會超出範圍。標籤的使用期限在下面註明。 label
是 a QLabel
本身。
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QLabel label; // label is born
label.setText ("cdsadsaf"); // label is alive
label.setParent (this); // label is alive
} // label dies
動態分配內存後,標籤顯示出來。
這是因爲標籤沒有超出範圍。指向它的指針的確如此,但這並不重要。請注意,label
僅僅是一個指針,並且該對象獨立於指向它的指針存在。
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QLabel *label = new QLabel(this); // label is born, QLabel is born
label->setText("first line\nsecond line"); // label is alive, QLabel is alive
} // label dies, QLabel is alive
爲什麼是必要的動態內存分配QLabel工作?
不是。由於使用動態分配,您碰巧給QLabel
留下了活力的機會,但這只是一個巧合。
您可以將標籤作爲父對象本身的一部分 - 它不需要單獨分配。編譯器會爲你管理內存。
#include <QtWidgets>
class MainWindow : public QMainWindow {
QWidget m_central;
QGridLayout m_layout{&m_central};
QLabel m_label{"Hello, World"};
public:
MainWindow(QWidget * parent = {}) : QMainWindow{parent} {
m_layout.addWidget(&m_label, 0, 0);
setCentralWidget(&m_central);
}
};
int main(int argc, char ** argv) {
QApplication app{argc, argv};
MainWindow w;
w.show();
return app.exec();
}
爲什麼這會降低投票率? –
因爲「堆棧」這個詞在C++標準中並不存在,所以不需要描述會發生什麼。每個人似乎都忘記的概念是**範圍**。該對象超出範圍並不復存在。它**無關緊要** C++編譯器如何實現超出範圍。編譯器可以兼容並生成將所有自動變量放在堆上的代碼。堆棧不需要解釋發生了什麼 - 這是一個實現細節。 –
@KubaOber,我很欣賞你的觀點。感謝您加入澄清。 FWIW,C++ 11標準在很多地方提到了堆棧。 –