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