Почему Qt нужно размещать дочерние объекты в куче? - PullRequest
6 голосов
/ 25 февраля 2009
class MyWidget : public QWidget { public:
    MyWidget( QWidget *parent=0, const char *name=0 ); };


MyWidget::MyWidget( QWidget *parent, const char *name )
        : QWidget( parent, name ) {
    QPushButton *quit = new QPushButton( "Quit", this, "quit" );
    quit->setGeometry( 62, 40, 75, 30 );
    quit->setFont( QFont( "Times", 18, QFont::Bold ) ); 
} 

В приведенном выше коде quit размещается в Heap, и это необходимо, поскольку он является потомком MyWidget

Почему Qt нужно размещать дочерние объекты в куче?

Ответы [ 4 ]

5 голосов
/ 28 февраля 2009

В вашем примере, для выхода не нужно выделять кучу.

Этот код компилируется и выполняется нормально:

struct MyWidget : QWidget 
{
    QPushButton quit;

    MyWidget()
    {
        quit.setGeometry( 62, 40, 75, 30 );
        quit.setFont( QFont( "Times", 18, QFont::Bold ) );
    }
};
2 голосов
/ 28 февраля 2009

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

Альтернативой, конечно, является объявление quit в качестве переменной-члена MyWidget. Если вы сделаете это, вам нужно будет включить заголовочный файл для QPushButton, где объявлено MyWidget, а не в файл реализации. В приведенном вами примере также используются родительские отношения QObject s, чтобы отслеживать память для кнопки и удалять ее при уничтожении, поэтому ее не нужно указывать в качестве члена класса.

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

0 голосов
/ 25 февраля 2009

Какие еще есть варианты? Из стека? Как бы Qt узнал, когда выделять из стека, а когда из кучи? Вещи, выделенные из стека, исчезнут, как только текущая функция вернется, поэтому время жизни объекта может быть намного меньше времени использования. Представьте себе добавление узла в дерево. Узел будет использоваться долгое время после возврата текущей функции. Это может привести к доступу к случайной памяти, ошибкам сегментации, дампам ядра и т. Д.

0 голосов
/ 25 февраля 2009

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

Не могли бы вы конкретизировать свой вопрос?

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