в Delphi какая польза от установки владельца как Application вместо nil? - PullRequest
3 голосов
/ 04 апреля 2020

«Приложение» является частью VCL и, следовательно, не является поточно-ориентированным (вероятно, для поддержки не-поточно-безопасного списка принадлежащих ему компонентов).

Проект, над которым я работаю, имеет несколько случаи, когда Application установлено как Owner, а Self не является опцией (метод класса). Вместо этого я хотел бы передать «nil», учитывая, что переменная освобождается в конце этой функции.

Предполагается, что кто-то забудет освободить переменную, принадлежащую Приложению:

при закрытии приложения , память освобождается. Но я также читал, что Windows отслеживает объем памяти, выделенной для каждого процесса. Таким образом, теоретически, если переменная, находящаяся в нуле, не была освобождена, Windows освободит ее, когда приложение / процесс завершатся.

Какая выгода, если установить для владельца Application значение по сравнению с Nil?

Следующий вопрос говорит об ответственности за освобождение переменных, принадлежащих nil, но останавливается на этом:

Что означает значение владельца nil в конструкторе компонентов

1 Ответ

5 голосов
/ 04 апреля 2020

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

Такое же поведение можно наблюдать с компонентами, принадлежащими одноэлементному приложению объект. Если они явно не уничтожены, то они уничтожаются только после завершения работы приложения. Опять же, эти утечки могут накапливаться с течением времени по мере выполнения процесса.

Обычный метод обнаружения утечек состоит в том, чтобы отслеживать все распределения во время выполнения, а затем, в качестве окончательного акта завершения процесса, проверить, что все распределения имели соответствующие освобождения. Эта функциональность предлагается различными инструментами, но в контексте Delphi диспетчер памяти FastMM является наиболее часто используемым инструментом, который предлагает это.

Если вы создаете компонент, который принадлежит объекту приложения, и не уничтожаете его явно, он не будет отображаться как утечка при выполнении проверки на утечку. Это нежелательно, потому что у вас есть настоящие утечки, которые не обнаружены.

Этот аргумент приводит к выводу, что было бы предпочтительно иметь неизвестные компоненты в сценарии, который вы описываете.

Обратная сторона этого заключается в том, что иногда вы создаете компоненты, которые вы будете sh жить так долго, как объект приложения, и может быть трудно найти хорошее место в коде, чтобы уничтожить их явно. В этом случае владение объектом приложения является хорошим подходом. Это именно то, для чего предназначен механизм владельца.

Мои эмпирические правила здесь:

  1. Если компонент создан потоковой системой (то есть формой A), он будет использовать Механизм собственности для обеспечения правильного управления жизненным циклом. Вам нечего делать в коде.
  2. Если вы создаете компонент явно в коде, то лучше следовать обычным шаблонам создания, а также явно уничтожить его в коде. В этом случае сделайте компонент недоступным.
  3. Если вам нелегко найти подходящее место для уничтожения компонента, и вы не можете ie его время жизни другому компоненту (то есть приложению), передайте этот компонент в качестве владельца.

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

В заключение, нет единого жесткого правила, которому нужно следовать. Вам необходимо понять последствия владения, а затем выбрать подходящего владельца для каждого компонента, который может варьироваться от одной ситуации к другой.

...