動的にメモリを割り当てないこのコードは、ウィンドウにラベルを表示しません。
これは、コンストラクタから返されるとすぐにラベルが有効範囲外になるためです。ラベルの寿命は以下のとおりです。 label
はaQLabel
です。動的メモリを割り当てた後
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
は単なるポインタであり、QLabel
オブジェクトはそのポインタとは独立して存在することに注意してください。
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();
}
なぜこれがダウン表示されますか? –
"stack"という単語はC++標準のどこにもないので、何が起こるか記述する必要はありません。誰もが忘れそうなコンセプトは、** scope **です。オブジェクトは範囲外になり、存在しなくなります。それは**重要ではありません**どのようにC + +コンパイラは、スコープの外出を実装します。コンパイラは、互換性があり、すべての自動変数をヒープ上に配置するコードを生成することができます。スタックは何が起こっているのかを説明する必要はありません。実装の詳細です。 –
@KubaOber、私はあなたの視点に感謝します。説明を追加していただきありがとうございます。 FWIW、C++ 11標準ではかなりの場所でスタックが記述されています。 –