| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Нужно ли самостоятельно удалать объекты |
| Автор: yngwie19 10.1.2009, 22:42 | ||||
| Всем привет, у меня вот такой вопрос. 1) Нужно ли после создания кисти ее самостоятельно уничтожать? например:
2) Нужно ли после изменения в контексте дисплея сохранять шрифт по умолчанию, для последующего его возврата в контекст, или винда опять все сделает сама и нам об этом беспокоиться не стоит. Например:
Вот здесь в предпоследней строчке обязательно делать возврат начального шрифта или нет? |
| Автор: GoldFinch 10.1.2009, 22:58 |
| если после закрытия окна завершается процесс то все удалится само |
| Автор: yngwie19 11.1.2009, 00:40 |
| GoldFinch, а по поводу второго вопроса? про возврат шрифта в контекст дисплея, чего сказать можете |
| Автор: Dem_max 11.1.2009, 05:11 |
| Да возвращай. |
| Автор: yngwie19 11.1.2009, 11:10 |
| Dem_max, Можешь объяснить почему? |
| Автор: maxim1000 11.1.2009, 11:26 |
я бы очень сильно порекомендовал удалить хотя бы по той причине, что всё, что выделено/открыто нужно освобождать/закрывать в частности, в будущем может появиться потребность создавать и удалять много экземпляров таких окон, и если они не будут за собой убирать, получится утечка, а утечка GDI-объектов иногда имеет более неприятные последствия, чем, например, утечка памяти кроме того, я бы посоветовал уменьшать время жизни объекта как можно сильнее, пока это не приводит к заметному снижению производительности т.е. в данном случае создавать кисть, когда она нужна, и удалять сразу после использования а то если каждое приложение будет создавать всё, что когда-нибудь может понадобиться, при старте и освобождать при завершении, GDI-объектов может банально не хватить на всех... |
| Автор: GoldFinch 11.1.2009, 12:21 |
| maxim1000, ExitProcess() удалит все хендлы, о какой утечке ресурсов речь? кстати, какое максимальное число GDI-объектов? |
| Автор: maxim1000 11.1.2009, 19:15 |
речь идёт о такой ситуации: при создании окна создаётся GDI-объект, при уничтожении не удаляется в процессе исполнения программы окна создаются и удаляются много раз (например, что-то типа MessageBox своего) в таком случае количество созданных, но не удалённых GDI-объектов будет увеличиваться с каждым созданием такого окна судя по MSDN, оно зависит от доступных ресурсов кроме того есть возможность ограничить количество для процесса (но там лимит не меньше 256 должен быть), тогда есть шанс избежать неприятной ситуации, когда из-за одной программы с ошибкой начинают страдать все остальные |
| Автор: Earnest 12.1.2009, 14:29 |
| Любая нетривиальная программа, работабщая с GDI, для прорисовки создает свои объекты; причем заранее все создать просто невозможно, т.к. неизвестно, что именно может потребоваться. Пример: вывод каких-то объектов, каждый из которых имеет свой цвет (назначаемый пользователем). И если ты будешь только создавать, то минут через 10 работы программы все у тебя станет беленькое и страшненькое ... Утечка ресурсов - очень неприятная вешь. Так что слушай maxim1000 и приучайся всегда аккуратно подчищать за собой. Кстати, имей в виду, что если ты удалишь объект, выбранный в контекст, он на самом деле не удалится. Так что здесь тоже нужно быть аккуратным. С шрифтами тоже самое: сам создал - сам удаляй. Насчет того, восстанавливать контекст или нет, завист от типа контекста. Бывают контексты временный (и лично для объекта созданные). Тогда, даже если ты не восстановишь старый объект, он восстановится сам (т.к. при следующем заходе контекст будет ре-инициализирован), но тогда смотри пункт 1 (насчет утечек). Но бывают контексты общие, используемые совместно несколькими окнами. Тогда, сам понимаешь, оставленный тобою мусор может помешать работе в другом месте. Самый правильный подход - не зависеть от этого. Т.е. при каждом заходе в Paint все настраивать с нуля, а потом все восстановить. Это проще всего сделать одним махом - есть функция Save\RestoreDCState. Кстати, под этим "все" можно понимать также режимы прозрачности, цвет фона\текста и т.д., а не только объекты. |
| Автор: yngwie19 12.1.2009, 19:29 |
| Earnest, Спасибо за грамотный ответ |