Delphi-Help

Главная Статьи Память и Указатели Функции для выделения, перераспределения и освобождения памяти

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

Оцените материал
(0 голосов)


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

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

AllocateMem - выделяет блок памяти из Count записей по RecSize байт, возвращает

адрес выделенного блока памяти в случае успеха или nil в случае ошибки.

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

AllocateMem. В качестве параметра Pointer можт быть использован как типизированный так и нетипизированный указатель.

DeallocateMem - освобождает память, выделенную функциями AllocateMem или

ReallocateMem. В качестве параметра Pointer можт быть использован как типизированный так и нетипизированный указатель.

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

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.
Прочитано 4596 раз
Другие материалы в этой категории: « Увеличение значения указателя Задача 585 на Pascal »

Авторизация



Счетчики