Delphi автоматически управляет памятью
Атомарные переменные в Delphi, такие как Integer, Boolean, Record, Enumeration и т. д., автоматически выделяются компилятором для памяти в пределах области видимости и автоматически освобождаются при выходе за ее пределы. Кроме того, строки, варианты, динамические массивы и интерфейсы. также автоматически управляются Delphi.
Все эти переменные хранятся в стеке , за исключением интерфейсов. Кроме того, Variant создается вручную программистами с помощью таких функций, как VarArrayCreate; динамические массивы также создаются программистами вручную с помощью таких функций, как SetLength, но в обоих случаях программистам не нужно выпускать его самостоятельно.
Кроме того, необходимо отметить еще один тип переменных: переменную, объявленную с помощью Threadvar, и ее областью действия является поток. В основном это используется при написании многопоточных функций, чтобы каждый поток использовал одно локальное хранилище потока.
Память, управляемая вручную программистами
Указатели и объекты требуют, чтобы программисты вручную обращались к памяти и освобождали ее.
Указатели включают PChar, Pointer (нетипизированный указатель), указатель записи, указатель переменной (указывающий на атомарную переменную), указатель функции (например, функцию обратного вызова, разделенную на глобальные функции и методы объекта). Используйте функцию New, чтобы запросить память, и используйте Dispose, чтобы освободить указатель. Кроме того, GetMem, ReallocMem и FreeMem также представляют собой серию функций для запроса и освобождения памяти. Вы можете читать и устанавливать три функции управления памятью Delphi с помощью функций GetMemoryManager и SetMemoryManager.
Объекты включают объекты подклассов, унаследованные от двух деревьев наследования: TObject и IUnknown. Объекты должны быть созданы с использованием методов конструктора. Если вы не указываете владельца объекта, созданного с помощью метода конструктора (обычно Create, но это может быть и не так; компилятор Delphi распознает только ключевое слово конструктора), вы должны освободить его вручную. Даже если вы укажете владельца, вам все равно нужно проверить реальную ситуацию. Его необходимо опубликовать в определенный момент. Обычно для освобождения используется метод Free (IUnknown не требует освобождения вручную). Лучшим методом является использование FreeAndNil (в модуле Sysutils.pas), который не только освобождает занятую память, но и освобождает сам указатель.
Эти переменные хранятся в куче . Еще одна проблема, требующая внимания, заключается в том, что указатели в TList должны освобождаться самим программистом.
Примечание:
1. Функция обратного вызова не относится к технической области управления памятью. Подробности смотрите в разделе «Указатель».
2. Подробную информацию об объекте можно найти в разделе «Объектная модель».
3. Если указатель используется в нескольких местах и если одно из мест освобождено, возникнет исключение, если он используется в других местах. Это проблема, на которую следует обратить внимание при использовании указателей. Подробную информацию о памяти можно найти в разделе «Указатель».
4. Передача указателей имеет два очевидных преимущества: экономия памяти и повышение скорости. Подробную информацию о памяти см. в разделах «Указатели» и «Советы по проектированию».
5. Как оценивать объекты и указатели — это очень техническая тема. На csdn есть несколько сообщений. Вы также можете увидеть статью, написанную Aimingoo ([email protected]) под названием «О том, как определить, есть ли указатель». есть статья "Углубленное обсуждение объекта". Подробную информацию о памяти смотрите в разделах «Указатель» и «Объект».
Завершено 19 января 2004 г.
Все права защищены. Пожалуйста, исправляйте любые неуместные комментарии.