Russian Qt Forum

Qt => Общие вопросы => Тема начата: Wachburn от Март 24, 2010, 21:25



Название: по поводу delete
Отправлено: Wachburn от Март 24, 2010, 21:25
по нажатии на кнопку создается диалоговое окно командой new... когда оно закрывается - оно уничтожается... так нужно ли вручную уничтожать элементы управления этого окна, для которых была выделена память в динамической области,например new QPushButton(), командой delete или они уничтожатся средствами Qt автоматически?


Название: Re: по поводу delete
Отправлено: niXman от Март 24, 2010, 21:46
Цитировать
командой new
это оператор.

а почему при помощи new, а не на стеке?
можно взглянуть на код?


Название: Re: по поводу delete
Отправлено: cya-st от Март 24, 2010, 21:52
Во избежание утечки памяти, на каждое new должно быть свое delete.


Название: Re: по поводу delete
Отправлено: niXman от Март 24, 2010, 21:54
Цитировать
Во избежание утечки памяти, на каждое new должно быть свое delete.
во избежании утечек памяти, new лучше вообще не использовать. в 98% случаев, этого можно не делать.


Название: Re: по поводу delete
Отправлено: cya-st от Март 24, 2010, 21:55
Уточнение. Сказанное выше справедливо для диалога, а для дочернего окна нужно установить атрибут pWidget->setAttribute(Qt::WA_DeleteOnClose);


Название: Re: по поводу delete
Отправлено: cya-st от Март 24, 2010, 22:01
Цитировать
Во избежание утечки памяти, на каждое new должно быть свое delete.
во избежании утечек памяти, new лучше вообще не использовать. в 98% случаев, этого можно не делать.
new - можно и надо использовать (тогда зачем new и delete присутствует в С++?), утечка памяти происходит в таких моментах и не только как я описал выше. В неумелых руках (к вам это не относится, а то сейчас топик не в то русло пойдет :)) и оператор if может привести к утечке памяти. :)


Название: Re: по поводу delete
Отправлено: Alex Custov от Март 24, 2010, 22:21
new - можно и надо использовать (тогда зачем new и delete присутствует в С++?), утечка памяти происходит в таких моментах и не только как я описал выше. В неумелых руках (к вам это не относится, а то сейчас топик не в то русло пойдет :)) и оператор if может привести к утечке памяти. :)

для модальных диалоговых окон лучше использовать стек - во впервых выделение памяти в стеке быстрее чем в куче, во вторых объект диалога сам удалится при выходе из метода.


Название: Re: по поводу delete
Отправлено: niXman от Март 24, 2010, 22:41
Цитировать
new - можно и надо использовать
спорить не стану, все равно не поймете.

Цитировать
тогда зачем new и delete присутствует в С++?
не для того, чтоб повсеместно, в пользовательском коде использовать. назначение другое.

Цитировать
утечка памяти происходит в таких моментах и не только
"утечка памяти, это интимное дело программиста и его кривых рук. возможно унаследованных" (c) niXman

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


Название: Re: по поводу delete
Отправлено: zenden от Март 24, 2010, 22:41
При удалении родительского объекта Qt автоматически удаляет все child-объекты.


Название: Re: по поводу delete
Отправлено: niXman от Март 24, 2010, 22:43
Цитировать
При удалении родительского объекта Qt автоматически удаляет все child-объекты.
ага.
а при завершении процесса, ОС удаляет всю выделенную им память. но это не значит что ее не нужно самому освобождать.
хотя, очень часто вижу обратное ;D


Название: Re: по поводу delete
Отправлено: pastor от Март 24, 2010, 22:46
во избежании утечек памяти, new лучше вообще не использовать. в 98% случаев, этого можно не делать.

и получить Stack overflow


Название: Re: по поводу delete
Отправлено: pastor от Март 24, 2010, 22:51
но это не значит что ее не нужно самому освобождать.

Хочешь удалять сам - удаляй. Никто же не запрещает )) Это С++. Но и ненужно пропускать мимо сам функционал фрейворка


Название: Re: по поводу delete
Отправлено: cya-st от Март 24, 2010, 22:52
Цитировать
во избежании утечек памяти, new лучше вообще не использовать. в 98% случаев, этого можно не делать.
Если человек вызывает new значит надо и вызвать delete.


Название: Re: по поводу delete
Отправлено: niXman от Март 24, 2010, 23:03
во избежании утечек памяти, new лучше вообще не использовать. в 98% случаев, этого можно не делать.

и получить Stack overflow
вот скажите, к примеру, сколько нужно создать объектов типа QDialog, к примеру, на стеке, что получить сие чудо? ;)


Название: Re: по поводу delete
Отправлено: cya-st от Март 24, 2010, 23:08
во избежании утечек памяти, new лучше вообще не использовать. в 98% случаев, этого можно не делать.

и получить Stack overflow
вот скажите, к примеру, сколько нужно создать объектов типа QDialog, к примеру, на стеке, что получить сие чудо? ;)
А если предположить, что программа для девайса (симбиан например)? Я могу и ошибатся, но там тоже есть диалоги.


Название: Re: по поводу delete
Отправлено: alexman от Март 25, 2010, 00:06
Зачем париться с удалением виджетов? Ведь в Qt есть механизм для этих целей!?


Название: Re: по поводу delete
Отправлено: cya-st от Март 25, 2010, 00:12
Зачем париться с удалением виджетов? Ведь в Qt есть механизм для этих целей!?
А диалогов?


Название: Re: по поводу delete
Отправлено: alexman от Март 25, 2010, 00:17
Смотря как реализовывать! Если по new, то можно создать один раз, и тогда опять работает механизм Qt (имеется ввиду, что есть родитель).


Название: Re: по поводу delete
Отправлено: Wachburn от Март 25, 2010, 00:19
вот что пишут:
http://www.crossplatform.ru/node/25
http://www.opennet.ru/docs/RUS/qt3_prog/c345.html

Механизм "владелец-подчиненный" реализован в классе QObject, который является предком как для QWidget, так и для QLayout. Когда создается некий объект (виджет, менеджер компоновки или что-то еще), для которого явно указывается владелец, то он добавляется владельцем в свой список подчиненных компонентов. Когда владелец уничтожается, он проходит по списку подчиненных компонентов и уничтожает их одного за другим. Подчиненные компоненты, в свою очередь просматривают свои списки и уничтожают компоненты, подчиненные им и так до тех пор, пока дело не дойдет до компонентов, которые не имеют подчиненных объектов.

Этот механизм упрощает управление памятью в приложении, снижая риск "утечки". Единственные объекты, которые необходимо уничтожать явно -- это те, которые были созданы оператором new, и не имеют владельца. Если первым удаляется подчиненный компонент, то Qt автоматически исключит его из списка владельца.


Название: Re: по поводу delete
Отправлено: alexman от Март 25, 2010, 00:20
вот что пишут:
http://www.crossplatform.ru/node/25
http://www.opennet.ru/docs/RUS/qt3_prog/c345.html

Механизм "владелец-подчиненный" реализован в классе QObject, который является предком как для QWidget, так и для QLayout. Когда создается некий объект (виджет, менеджер компоновки или что-то еще), для которого явно указывается владелец, то он добавляется владельцем в свой список подчиненных компонентов. Когда владелец уничтожается, он проходит по списку подчиненных компонентов и уничтожает их одного за другим. Подчиненные компоненты, в свою очередь просматривают свои списки и уничтожают компоненты, подчиненные им и так до тех пор, пока дело не дойдет до компонентов, которые не имеют подчиненных объектов.

Этот механизм упрощает управление памятью в приложении, снижая риск "утечки". Единственные объекты, которые необходимо уничтожать явно -- это те, которые были созданы оператором new, и не имеют владельца. Если первым удаляется подчиненный компонент, то Qt автоматически исключит его из списка владельца.
Это уже сказано выше...


Название: Re: по поводу delete
Отправлено: Wachburn от Март 25, 2010, 00:25
Это уже сказано выше...
мало ли, может товарищи не понимают о каком механизме ты имеешь ввиду, так я подробнее написал


Название: Re: по поводу delete
Отправлено: alexman от Март 25, 2010, 00:27
Это уже сказано выше...
мало ли, может товарищи не понимают о каком механизме ты имеешь ввиду, так я подробнее написал
Это не я сказал, а zenden!


Название: Re: по поводу delete
Отправлено: Wachburn от Март 25, 2010, 00:31
Это уже сказано выше...
мало ли, может товарищи не понимают о каком механизме ты имеешь ввиду, так я подробнее написал
Это не я сказал, а zenden!

кто такой zenden ?


Название: Re: по поводу delete
Отправлено: alexman от Март 25, 2010, 00:32
Это уже сказано выше...
мало ли, может товарищи не понимают о каком механизме ты имеешь ввиду, так я подробнее написал
Это не я сказал, а zenden!

кто такой zenden ?

См. выше...


Название: Re: по поводу delete
Отправлено: pastor от Март 25, 2010, 02:18
вот скажите, к примеру, сколько нужно создать объектов типа QDialog, к примеру, на стеке, что получить сие чудо? ;)

Нет ничего проще как взять и проверить самому )) Если у тебя приложение с одним диалогом и одним кнопарем ОК, то проблем в этом случае не будет.
Но как правило приложение не ограничивается одними диалогами, есть еще всякого рода структуры данных разного объема.


Название: Re: по поводу delete
Отправлено: niXman от Март 25, 2010, 02:46
pastor, понятно, что не все пишут программы с одним диалогом и одним баттоном.
просто я, из своего опыта, могу сказать, что у меня такой ошибки не возникало никогда. при том, на весьма не простых проектах. в том числе и на Qt.
и да, я не размещаю на стеке массивы объектов/структур.