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 함수를 호출하여 할당 된 메모리 블록의 크기를 늘리거나 줄일 수 있습니다 . 위의 프로그램을 다시 한번 확인하고 ReAllocMemfreemem 서브 프로그램 을 활용보겠습니다 . 다음은 ReAllocMem 의 구문입니다 -

function ReAllocMem(
   var p: pointer;
   Size: PtrUInt
):pointer;

다음은 ReAllocMemfreemem 하위 프로그램을 사용하는 예입니다.

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;

스택 세그먼트 레지스터 값을 반환합니다.