Дело в том, что элементы управления Qt (метки, кнопки) находятся в иерархии (например, кнопки принадлежат формам).И способ реализации Qt требует, чтобы при уничтожении объекта все объекты, принадлежащие ему, также уничтожались.
Если вы помещаете объекты в стек (вот как «создать без new
ключевое слово»на самом деле называется), они будут уничтожены автоматически.Это свойство C ++, и оно распространяется на все программы.Вот как все будет работать, если вы разместите свою метку в стеке.
{
QLabel ql = QLabel(some_form);
ql.show()
} // scope ends, ql is deleted
delete some_form;
// ql will be deleted here as well
// but it's already dead!
// Program crashes!
Такое распределение в стеке будет означать, что при уничтожении объекта, которому принадлежит метка, метка уже может быть уничтожена.Это приведет к сбою вашей программы.
На самом деле, вы можете иногда создавать объекты в стеке.В функции main
вы можете разместить в стеке «основное управление» (обычно это главное окно).Дело в том, что этот объект не будет уничтожен во время выполнения программы, поэтому он может безопасно находиться в стеке до тех пор, пока не выйдет основной - т.е. программа завершится.Вот цитата из руководства по Qt :
#include <QApplication>
#include <QPushButton>
#include <QTranslator>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QTranslator translator;
translator.load("hellotr_la");
app.installTranslator(&translator);
QPushButton hello(QPushButton::tr("Hello world!"));
hello.resize(100, 30);
hello.show();
return app.exec();
}