Хотя это правда, что система освобождает память после завершения процесса, утечки во время выполнения являются потенциальной проблемой. Если программа выполняет повторяющиеся действия и каждый раз теряет память, то эти утечки накапливаются со временем и в конечном итоге приводят к нехватке памяти.
Такое же поведение можно наблюдать с компонентами, принадлежащими одноэлементному приложению объект. Если они явно не уничтожены, то они уничтожаются только после завершения работы приложения. Опять же, эти утечки могут накапливаться с течением времени по мере выполнения процесса.
Обычный метод обнаружения утечек состоит в том, чтобы отслеживать все распределения во время выполнения, а затем, в качестве окончательного акта завершения процесса, проверить, что все распределения имели соответствующие освобождения. Эта функциональность предлагается различными инструментами, но в контексте Delphi диспетчер памяти FastMM является наиболее часто используемым инструментом, который предлагает это.
Если вы создаете компонент, который принадлежит объекту приложения, и не уничтожаете его явно, он не будет отображаться как утечка при выполнении проверки на утечку. Это нежелательно, потому что у вас есть настоящие утечки, которые не обнаружены.
Этот аргумент приводит к выводу, что было бы предпочтительно иметь неизвестные компоненты в сценарии, который вы описываете.
Обратная сторона этого заключается в том, что иногда вы создаете компоненты, которые вы будете sh жить так долго, как объект приложения, и может быть трудно найти хорошее место в коде, чтобы уничтожить их явно. В этом случае владение объектом приложения является хорошим подходом. Это именно то, для чего предназначен механизм владельца.
Мои эмпирические правила здесь:
- Если компонент создан потоковой системой (то есть формой A), он будет использовать Механизм собственности для обеспечения правильного управления жизненным циклом. Вам нечего делать в коде.
- Если вы создаете компонент явно в коде, то лучше следовать обычным шаблонам создания, а также явно уничтожить его в коде. В этом случае сделайте компонент недоступным.
- Если вам нелегко найти подходящее место для уничтожения компонента, и вы не можете ie его время жизни другому компоненту (то есть приложению), передайте этот компонент в качестве владельца.
Возвращаясь к заданному вами вопросу. Вы спросили, почему выгодно использовать объект приложения в качестве владельца. Как указывалось выше, во многих случаях на самом деле выгодно, чтобы такие компоненты были недоступны. Но также бывают случаи, когда выгодно иметь объект приложения в качестве владельца.
В заключение, нет единого жесткого правила, которому нужно следовать. Вам необходимо понять последствия владения, а затем выбрать подходящего владельца для каждого компонента, который может варьироваться от одной ситуации к другой.