Как отмечали другие плакаты, эти объекты должны быть явно освобождены. Обычно это делается вручную с помощью блока try..finally, как показал Рэй. Однако есть исключения, о которых вы должны знать.
Компоненты (потомки TComponent) передают свой конструктор своему конструктору. Если владелец не nil, тогда компонент владельца получит право собственности на новый компонент и освободит его при его освобождении. Вот почему вам не нужно очищать свои собственные формы; они подключены к объекту Application, который знает, как освободить себя, когда программа закончена. Однако, если вы создаете компонент во время выполнения, вам нужно либо присвоить его владельцу, либо передать nil конструктору, а затем бесплатно загрузить его. Не смешивайте их, освобождая компонент вместе с владельцем. Это может привести к условию двойного освобождения при определенных обстоятельствах.
Связанные объекты, которые реализуют подсчет ссылок (в основном, потоки TInterfacedObject) освобождаются механизмом подсчета ссылок, если вы ссылаетесь на них конкретно как на интерфейс (а не как на объект). Они автоматически освобождаются, когда последняя ссылка на них удален. Не освобождайте объект TInterfacedObject вручную, если вы уже присвоили ему ссылку на интерфейс. Это вызовет исключение.Кроме того, имейте в виду, что не все объекты с интерфейсами реализуют подсчет ссылок. В основном только те, которые происходят от TInterfacedObject.
Не всегда удобно создавать объект, использовать блок try..finally, а затем освобождать его. Иногда это просто не работает для того, что вы делаете, особенно если вы назначаете объект в какой-то список (и делаете их очень много). В этом случае рекомендуется использовать TObjectList (или еще лучше, если у вас есть D2009, TObjectList) с свойством OwnsObjects, установленным на true. Это приводит к тому, что список становится владельцем объектов в нем и освобождает их, когда он освобождается, как и компоненты. Опять же, не освобождайте объект вручную, если он принадлежит списку объектов.
Динамические массивы (включая строки) управляются компилятором с помощью системы подсчета ссылок, а большинство других типов переменных выделяются в стеке. Вам никогда не придется беспокоиться о том, чтобы вручную освобождать что-либо, кроме объектов, если вы не играете с указателями.
Это, вероятно, звучит сложно, но вы скоро привыкнете к нему. Просто помните, что каждый объект принадлежит одной из трех вещей: другому объекту, системе подсчета ссылок на интерфейс или вашему коду, а владелец должен освобождать все свои объекты, когда они больше не нужны. Ничто не должно пытаться освободить то, что принадлежит другому. (Нельзя красть.) Помните эти рекомендации, и вы получите хорошее управление памятью. Вы также можете установить «ReportMemoryLeaksOnShutdown: = true» в основной процедуре вашего DPR для получения дополнительной помощи.
и ссылки на строки и ссылки на интерфейс –
Создается перед попыткой. Всегда. – Ray
Если вы используете это, вы получите предупреждения для каждого объекта, так как возможно, что создание не удастся, и тогда объект попытается освободиться. – Ray