Название: по поводу 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% случаев, этого можно не делать.Название: 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 Название: Re: по поводу delete Отправлено: cya-st от Март 24, 2010, 23:08 во избежании утечек памяти, new лучше вообще не использовать. в 98% случаев, этого можно не делать. и получить Stack overflow Название: 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 Это уже сказано выше... мало ли, может товарищи не понимают о каком механизме ты имеешь ввиду, так я подробнее написалНазвание: Re: по поводу delete Отправлено: Wachburn от Март 25, 2010, 00:31 Это уже сказано выше... мало ли, может товарищи не понимают о каком механизме ты имеешь ввиду, так я подробнее написалкто такой zenden ? Название: Re: по поводу delete Отправлено: alexman от Март 25, 2010, 00:32 Это уже сказано выше... мало ли, может товарищи не понимают о каком механизме ты имеешь ввиду, так я подробнее написалкто такой zenden ? См. выше... Название: Re: по поводу delete Отправлено: pastor от Март 25, 2010, 02:18 вот скажите, к примеру, сколько нужно создать объектов типа QDialog, к примеру, на стеке, что получить сие чудо? ;) Нет ничего проще как взять и проверить самому )) Если у тебя приложение с одним диалогом и одним кнопарем ОК, то проблем в этом случае не будет. Но как правило приложение не ограничивается одними диалогами, есть еще всякого рода структуры данных разного объема. Название: Re: по поводу delete Отправлено: niXman от Март 25, 2010, 02:46 pastor, понятно, что не все пишут программы с одним диалогом и одним баттоном.
просто я, из своего опыта, могу сказать, что у меня такой ошибки не возникало никогда. при том, на весьма не простых проектах. в том числе и на Qt. и да, я не размещаю на стеке массивы объектов/структур. |