LINUX.ORG.RU

Нужно ли освобождать память в деструкторе?

 ,


0

1

Подскажите, пожалуйста, когда я в конструкторе виджета выделяю память под, например, объект класса, нужно ли явно освобождать её в деструкторе? Объект класса (под который выделяется память) не является потомком (по крайней мере явно - в конструктор этого объекта не передаётся *parent) этого виджета. Или может виджет берёт на себя задачу освободить память после закрытия программы?

Там есть свои особенности по назначению родителей, например, при добавлении видежта на лейаут.

В любом случае QObject::deleteLater() спасет отца русской демократии.

trex6 ★★★★★
()

когда я в конструкторе виджета выделяю память под, например, объект класса, нужно ли явно освобождать её в деструкторе?

Если у вас свой виджет и вы в нем имеете ссылку на некий сторонний объект (не Q_OBJECT), то нужно.

А лучше используйте QSharedPointer и иже с ним.

no-such-file ★★★★★
()

не является потомком (по крайней мере явно - в конструктор этого объекта не передаётся *parent)

можно создать layout например, а потом сделать QWidget::setLayout, и тогда layout будет потомком виджета, удалять его не надо, и даже вредно.

Если уверен, что родителя нет (что по крайней мере странно и весьма не удобно для долгоживущих объектов), то надо. Можно проверить наличие родителя при помощи метода QObject::parent().

nanoolinux ★★★★
()

Подскажите, пожалуйста, когда я в конструкторе виджета выделяю память под, например, объект класса, нужно ли явно освобождать её в деструкторе?

Нужно, если право владения созданным таким образом объектом не было передано другому объекту. В каких случаях передается право на владение объектом можно выяснить только методом чтения документации на API класса (ну или исходников). Если проще - почитай описание всех функций, в которые ты передаешь указатель на свой объект, может встретишь там информацию о передаче права владения.

m0rph ★★★★★
()

Как вариант, если лень лезть в документацию или там про это не написано, можно попробовать освободить память в деструкторе и натравить потом на программу valgrind

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Ну запускать valgrind, замедляющий программу раз в 20, это конечно проще чем выделить имя Qt-шной функции и нажать F1. В QtCreator данное действие откроет панельку документации.

anonymous
()

Если это потомок QWidget, то разместив его где-то в лейаутах он станет потомком, значит удалится сам. Если просто потомок QObject, то либо назначать родителя, либо QObject::deletLater(). Если объект ни то ни другое оператор delete.

erfea ★★★★★
()
Ответ на: комментарий от theNamelessOne

В принципе вывод valgrind и натолкнул меня на эти мысли. Всем спасибо большое. Ваши советы оказались для меня очень полезными. Программа падала при закрытии, когда в деструкторе пытался освободить память. Но после приведения кода в порядок, valgrind, тем не менее, показывает 4 ошибки. Даже не знаю, что и думать.

tetramin
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.