Pascal-메모리 관리
이 장에서는 파스칼의 동적 메모리 관리에 대해 설명합니다. 파스칼 프로그래밍 언어는 메모리 할당 및 관리를위한 여러 기능을 제공합니다.
동적으로 메모리 할당
프로그래밍을하는 동안 배열의 크기를 알고 있다면 간단하고 배열로 정의 할 수 있습니다. 예를 들어, 어떤 사람의 이름을 저장하려면 최대 100 자까지 입력 할 수 있으므로 다음과 같이 정의 할 수 있습니다.
var
name: array[1..100] of char;
그러나 이제 저장해야하는 텍스트의 길이에 대해 전혀 모르는 상황 (예 : 주제에 대한 자세한 설명을 저장하려는 경우)을 고려해 보겠습니다. 여기에서는 필요한 메모리 양을 정의하지 않고 문자열에 대한 포인터를 정의해야합니다.
파스칼은 절차를 제공합니다 new포인터 변수를 만듭니다.
program exMemory;
var
name: array[1..100] of char;
description: ^string;
begin
name:= 'Zara Ali';
new(description);
if not assigned(description) then
writeln(' Error - unable to allocate required memory')
else
description^ := 'Zara ali a DPS student in class 10th';
writeln('Name = ', name );
writeln('Description: ', description^ );
end.
위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.
Name = Zara Ali
Description: Zara ali a DPS student in class 10th
이제 나중에 참조 할 특정 바이트 수로 포인터를 정의해야하는 경우 다음을 사용해야합니다. getmem 기능 또는 getmem 다음 구문을 가진 절차-
procedure Getmem(
out p: pointer;
Size: PtrUInt
);
function GetMem(
size: PtrUInt
):pointer;
이전 예에서 우리는 문자열에 대한 포인터를 선언했습니다. 문자열의 최대 값은 255 바이트입니다. 실제로 그렇게 많은 공간이 필요하지 않거나 바이트 측면에서 더 큰 공간이 필요하지 않은 경우 getmem 하위 프로그램에서이를 지정할 수 있습니다. getmem을 사용하여 이전 예제를 다시 작성해 보겠습니다 .
program exMemory;
var
name: array[1..100] of char;
description: ^string;
begin
name:= 'Zara Ali';
description := getmem(200);
if not assigned(description) then
writeln(' Error - unable to allocate required memory')
else
description^ := 'Zara ali a DPS student in class 10th';
writeln('Name = ', name );
writeln('Description: ', description^ );
freemem(description);
end.
위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.
Name = Zara Ali
Description: Zara ali a DPS student in class 10th
따라서 완전한 제어가 가능하며 일단 크기를 정의하면 변경할 수없는 배열과 달리 메모리를 할당하는 동안 모든 크기 값을 전달할 수 있습니다.
메모리 크기 조정 및 해제
프로그램이 나오면 운영 체제는 프로그램에서 할당 한 모든 메모리를 자동으로 해제하지만 더 이상 메모리가 필요하지 않을 때 좋은 방법으로 해당 메모리를 해제해야합니다.
파스칼은 절차를 제공합니다 dispose 프로 시저를 사용하여 동적으로 생성 된 변수를 해제하려면 new. 다음을 사용하여 메모리를 할당 한 경우 getmem 하위 프로그램을 사용하려면 하위 프로그램을 사용해야합니다. freemem이 메모리를 해제합니다. freemem 서브 프로그램은 다음과 같은 구문을 가지고 -
procedure Freemem(
p: pointer;
Size: PtrUInt
);
function Freemem(
p: pointer
):PtrUInt;
또는 ReAllocMem 함수를 호출하여 할당 된 메모리 블록의 크기를 늘리거나 줄일 수 있습니다 . 위의 프로그램을 다시 한번 확인하고 ReAllocMem 과 freemem 서브 프로그램 을 활용 해 보겠습니다 . 다음은 ReAllocMem 의 구문입니다 -
function ReAllocMem(
var p: pointer;
Size: PtrUInt
):pointer;
다음은 ReAllocMem 및 freemem 하위 프로그램을 사용하는 예입니다.
program exMemory;
var
name: array[1..100] of char;
description: ^string;
desp: string;
begin
name:= 'Zara Ali';
desp := 'Zara ali a DPS student.';
description := getmem(30);
if not assigned(description) then
writeln('Error - unable to allocate required memory')
else
description^ := desp;
(* Suppose you want to store bigger description *)
description := reallocmem(description, 100);
desp := desp + ' She is in class 10th.';
description^:= desp;
writeln('Name = ', name );
writeln('Description: ', description^ );
freemem(description);
end.
위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.
Name = Zara Ali
Description: Zara ali a DPS student. She is in class 10th
메모리 관리 기능
Pascal은 다양한 데이터 구조를 구현하고 Pascal에서 저수준 프로그래밍을 구현하는 데 사용되는 메모리 관리 기능을 제공합니다. 이러한 기능의 대부분은 구현에 따라 다릅니다. Free Pascal은 메모리 관리를 위해 다음과 같은 기능과 절차를 제공합니다.
SN | 기능 이름 및 설명 |
---|---|
1 | function Addr(X: TAnytype):Pointer; 변수의 주소를 반환 |
2 | function Assigned(P: Pointer):Boolean; 포인터가 유효한지 확인 |
삼 | function CompareByte(const buf1; const buf2; len: SizeInt):SizeInt; 바이트 당 2 개의 메모리 버퍼를 비교합니다. |
4 | function CompareChar(const buf1; const buf2; len: SizeInt):SizeInt; 바이트 당 2 개의 메모리 버퍼를 비교합니다. |
5 | function CompareDWord(const buf1; const buf2; len: SizeInt):SizeInt; 바이트 당 2 개의 메모리 버퍼를 비교합니다. |
6 | function CompareWord(const buf1; const buf2; len: SizeInt):SizeInt; 바이트 당 2 개의 메모리 버퍼를 비교합니다. |
7 | function Cseg: Word; 코드 세그먼트를 반환합니다. |
8 | procedure Dispose(P: Pointer); 동적으로 할당 된 메모리를 해제합니다. |
9 | procedure Dispose(P: TypedPointer; Des: TProcedure); 동적으로 할당 된 메모리를 해제합니다. |
10 | function Dseg: Word; 데이터 세그먼트를 반환합니다. |
11 | procedure FillByte(var x; count: SizeInt; value: Byte); 8 비트 패턴으로 메모리 영역 채우기 |
12 | procedure FillChar( var x; count: SizeInt; Value: Byte|Boolean|Char); 특정 문자로 메모리 영역을 채 웁니다. |
13 | procedure FillDWord( var x; count: SizeInt; value: DWord); 메모리 영역을 32 비트 패턴으로 채 웁니다. |
14 | procedure FillQWord( var x; count: SizeInt; value: QWord); 메모리 영역을 64 비트 패턴으로 채 웁니다. |
15 | procedure FillWord( var x; count: SizeInt; Value: Word); 16 비트 패턴으로 메모리 영역 채우기 |
16 | procedure Freemem( p: pointer; Size: PtrUInt); 할당 된 메모리 해제 |
17 | procedure Freemem( p: pointer ); 할당 된 메모리 해제 |
18 | procedure Getmem( out p: pointer; Size: PtrUInt); 새 메모리 할당 |
19 | procedure Getmem( out p: pointer); 새 메모리 할당 |
20 | procedure GetMemoryManager( var MemMgr: TMemoryManager); 현재 메모리 관리자를 반환합니다. |
21 | function High( Arg: TypeOrVariable):TOrdinal; 열린 배열 또는 열거의 가장 높은 인덱스를 반환합니다. |
22 | function IndexByte( const buf; len: SizeInt; b: Byte):SizeInt; 메모리 범위에서 바이트 크기 값을 찾습니다. |
23 | function IndexChar( const buf; len: SizeInt; b: Char):SizeInt; 메모리 범위에서 문자 크기 값을 찾습니다. |
24 | function IndexDWord( const buf; len: SizeInt; b: DWord):SizeInt; 메모리 범위에서 DWord 크기 (32 비트) 값을 찾습니다. |
25 | function IndexQWord( const buf; len: SizeInt; b: QWord):SizeInt; 메모리 범위에서 QWord 크기 값을 찾습니다. |
26 | function Indexword( const buf; len: SizeInt; b: Word):SizeInt; 메모리 범위에서 단어 크기 값을 찾습니다. |
27 | function IsMemoryManagerSet: Boolean; 메모리 관리자가 설정되어 있습니까? |
28 | function Low( Arg: TypeOrVariable ):TOrdinal; 열린 배열 또는 열거의 가장 낮은 인덱스를 반환합니다. |
29 | procedure Move( const source; var dest; count: SizeInt ); 메모리의 한 위치에서 다른 위치로 데이터를 이동합니다. |
30 | procedure MoveChar0( const buf1; var buf2; len: SizeInt); 첫 번째 0 문자까지 데이터를 이동합니다. |
31 | procedure New( var P: Pointer); 변수에 동적으로 메모리 할당 |
32 | procedure New( var P: Pointer; Cons: TProcedure); 변수에 대한 메모리를 동적으로 할당합니다. |
33 | function Ofs( var X ):LongInt; 변수의 오프셋을 반환합니다. |
34 | function ptr( sel: LongInt; off: LongInt):farpointer; 세그먼트와 오프셋을 포인터에 결합 |
35 | function ReAllocMem( var p: pointer; Size: PtrUInt):pointer; 힙의 메모리 블록 크기를 조정합니다. |
36 | function Seg( var X):LongInt; 반품 구간 |
37 | procedure SetMemoryManager( const MemMgr: TMemoryManager ); 메모리 관리자를 설정합니다. |
38 | function Sptr: Pointer; 현재 스택 포인터를 반환합니다. |
39 | function Sseg: Word; 스택 세그먼트 레지스터 값을 반환합니다. |