QT - главный виджет - стек или куча? - PullRequest
9 голосов
/ 31 декабря 2011

Я немного запутался, стоит ли мне предпочитать инициализировать мои основные виджеты в стеке или в куче.В «Программировании C ++ GUI с QT 4» основные виджеты инициализируются в стеке.Прежде чем я скажу больше, я объясню, что я имею в виду:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow mainWin;
    mainWin.show();
    return app.exec();
}

Теперь, возможно, это просто потому, что это безопаснее, возможно, потому что они не хотят путать читателей с распределением памяти в QT.Исключение любых удалений объектов, унаследованных от QObject, безусловно, позволяет читателям «забыть» управление памятью с объектами QT.Но мой вопрос заключается в том, стоит ли нам отдавать предпочтение этому методу или следующему:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow* mainWin = new MainWindow;
    mainWin->show();
    int execReturn = app.exec();
    delete mainWin;
    return execReturn;
}

Основная причина, по которой я задаю этот вопрос, заключается в том, что я обычно предпочитаю следовать шаблону с выбором кучи против стека:

  • Если предмет большой - Куча
  • Если предмет долгосрочный - Куча
  • В противном случае - Стек

Теперь, я полагаю, мой вопрос сводится к двум вопросам:

  • Является ли QWidget большим, чтобы я боялся переполнения стека?
  • Насколько большой стек для среднего приложения?Когда мне следует опасаться переполнения стека (кроме явно рекурсивных функций)?

Я понимаю, что маловероятно, что сам QWidget вызовет переполнение стека, но, конечно, это будет на вершине любого другогоиспользование стека моим приложением.

Ответы [ 2 ]

3 голосов
/ 31 декабря 2011

Ваш шаблон для выбора кучи против стека звучит разумно, но я бы не стал сильно беспокоиться о размере объекта.Любой большой объект должен использовать кучу внутри.std :: vector обычно имеет размер трех указателей, но может быть очень большим.

Я не думаю, что вам следует опасаться, что любой объект достаточно велик, чтобы переполнить стек самостоятельно.Хотя это возможно, это, конечно, очень редко (я не видел ни одного).

Я бы порекомендовал подумать и о простоте, вы можете выделить любую локальную переменную в куче и затем освободить ее, прежде чем функция вернется, но этоЭто будет излишне сложно и обычно считается плохой практикой.

Размер стека обычно настраивается через настройки компоновщика.В Windows это по умолчанию 1 МБ.

2 голосов
/ 31 декабря 2011

Я предпочитаю использовать стековый подход, поскольку он просто дает короткий код. Ваше беспокойство о переполнении стека было бы правдоподобным, но вряд ли это произойдет.

Хотя у меня нет представления о размере QApplication и MainWindow, он (в основном) будет использовать кучу для внутренних структур данных, которые требуют огромного размера. Таким образом, вам не нужно беспокоиться о возможном переполнении стека.

Как правило, приложения Windows имеют размер стека 1 МБ. Но вы можете легко изменить, изменив параметр компоновщика: / STACK .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...