Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Функции для выделения, перераспределения и освобождения памяти

Delphi , Синтаксис , Память и Указатели

Функции для выделения, перераспределения и освобождения памяти

Автор: Dimka Maslov
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Функции для выделения/перераспределения/освобождения памяти

Модуль содержит функции для работы с блоками памяти.

AllocateMem - выделяет блок памяти из Count записей по RecSize байт, возвращает
адрес выделенного блока памяти в случае успеха или nil в случае ошибки.

ReallocateMem - устанавливает новый размер блока памяти, выделенного функцией
AllocateMem. В качестве параметра Pointer можт быть использован как
типизированный так и нетипизированный указатель.

DeallocateMem - освобождает память, выделенную функциями AllocateMem или
ReallocateMem. В качестве параметра Pointer можт быть использован как
типизированный так и нетипизированный указатель.

MemSize - возвращает размер блока памяти, выделенного функциями AllocateMem или
ReallocateMem.

Зависимости: Windows
Автор:       Dimka Maslov, mainbox@endimus.ru, ICQ:148442121, Санкт-Петербург
Copyright:   Dimka Maslov
Дата:        21 мая 2002 г.
***************************************************** }

unit MemFuncs;

uses Windows;

interface

function AllocateMem(Count: Integer; RecSize: Integer): Pointer;
procedure ReallocateMem(var Pointer; Count: Integer; RecSize: Integer = 1);
procedure DeallocateMem(var Pointer);
function MemSize(P: Pointer): Integer;

implementation

function LocalHandle; external kernel32 name 'LocalHandle';

function AllocateMem(Count: Integer; RecSize: Integer = 1): Pointer;
asm
   test eax, eax
   jle @@10
   test edx, edx
   jle @@10
   imul edx
   push eax
   push LHND
   call LocalAlloc
   push eax
   call LocalLock
   ret
@@10:
   xor eax, eax
end;

procedure ReallocateMem(var Pointer; Count: Integer; RecSize: Integer = 1);
asm
   push ebx
   mov ebx, eax
   mov eax, [ebx]
   test eax, eax
   jnz @@10
   mov eax, edx
   mov edx, ecx
   call AllocateMem
   mov [ebx], eax
   pop ebx
   ret
@@10:
   push ecx
   push edx
   push eax
   call LocalHandle
   pop edx
   pop ecx
   test eax, eax
   jnz @@20
   pop ebx
   ret
@@20:
   push eax
   mov eax, edx
   imul ecx
   mov edx, eax
   pop eax
   push LHND
   push edx
   push eax
   call LocalRealloc
   push eax
   call LocalLock
   mov [ebx], eax
   pop ebx
end;

procedure DeallocateMem(var Pointer);
asm
   push ebx
   mov ebx, eax
   mov eax, [ebx]
   test eax, eax
   jz @@10
   push eax
   call LocalHandle
   test eax, eax
   jz @@10
   push eax
   push eax
   call LocalUnlock
   call LocalFree
@@10:
   xor eax, eax
   mov [ebx], eax
   pop ebx
end;

function MemSize(P: Pointer): Integer;
asm
   test eax, eax
   jnz @@10
   ret
@@10:
   push eax
   call LocalHandle
   test eax, eax
   jnz @@20
   ret
@@20:
   push eax
   call LocalSize
end;

end.

Библиотека Delphi для управления памятью!

Единица MemFuncs предлагает набор функций для аллокации, реаллокации и деаллокации блоков памяти. Вот подробное описание каждой функции:

  1. AllocateMem(Count: Integer; RecSize: Integer): Pointer: Аллоцирует блок памяти с указанным количеством записей и размером записи в байтах. Возвращает указатель на аллокированную память или nil, если произошла ошибка.
  2. ReallocateMem(var Pointer; Count: Integer; RecSize: Integer = 1): Реаллоцирует блок памяти, указанный указателем входного параметра, изменяя его размер до указанного количества записей и размера записи в байтах. Если новый размер меньше оригинального, то избыточная память будет освобождена.
  3. DeallocateMem(var Pointer): Деаллоцирует блок памяти, указанный указателем входного параметра, освобождая связанные ресурсы.
  4. MemSize(P: Pointer): Integer: Возвращает размер блока памяти, указанного указателем входного параметра.

Функции используют вызовы Windows API для взаимодействия с операционной системой в области управления памятью. Реализация использует inline-ассемблерный код для оптимизации производительности и обеспечения правильного деаллокирования памяти.

Некоторые примечания к коду:

  • Функция LocalHandle является внешней функцией, импортированной из библиотеки Windows kernel32, которая предоставляет способ управления локальными блоками памяти.
  • Функции AllocateMem, ReallocateMem и DeallocateMem используют inline-ассемблерный код для взаимодействия с Windows API. Это позволяет иметь эффективное и точное управление аллокацией и деаллокацией памяти.
  • Функция MemSize просто возвращает размер блока памяти, указанного указателем входного параметра, без выполнения каких-либо операций над памятью.

В целом, эта библиотека предлагает удобный и эффективный способ управления блоками памяти в приложениях Delphi, а также обеспечивает точное управление аллокацией и деаллокацией памяти.

Модуль MemFuncs содержит функции для выделения, перераспределения и освобождения памяти в операционной системе Windows.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Память и Указатели ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 13:27:51/0.0056741237640381/1