Pascal - Quản lý bộ nhớ

Chương này giải thích về quản lý bộ nhớ động trong Pascal. Ngôn ngữ lập trình Pascal cung cấp một số chức năng để cấp phát và quản lý bộ nhớ.

Phân bổ bộ nhớ động

Trong khi lập trình, nếu bạn biết về kích thước của một mảng thì sẽ rất dễ dàng và bạn có thể xác định nó là một mảng. Ví dụ: để lưu trữ tên của bất kỳ người nào, nó có thể có tối đa 100 ký tự để bạn có thể xác định một cái gì đó như sau:

var
name: array[1..100] of char;

Nhưng bây giờ, chúng ta hãy xem xét một tình huống, trong đó bạn không có ý tưởng về độ dài của văn bản bạn cần lưu trữ, chẳng hạn như bạn muốn lưu trữ mô tả chi tiết về một chủ đề. Ở đây, chúng ta cần xác định một con trỏ tới chuỗi mà không cần xác định dung lượng bộ nhớ là bao nhiêu.

Pascal cung cấp một thủ tục newđể tạo biến con trỏ.

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.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

Bây giờ, nếu bạn cần xác định một con trỏ với số byte cụ thể sẽ được nó tham chiếu sau này, bạn nên sử dụng getmem chức năng hoặc getmem thủ tục, có cú pháp sau:

procedure Getmem(
   out p: pointer;
   Size: PtrUInt
);

function GetMem(
   size: PtrUInt
):pointer;

Trong ví dụ trước, chúng ta đã khai báo một con trỏ tới một chuỗi. Một chuỗi có giá trị tối đa là 255 byte. Nếu bạn thực sự không cần nhiều dung lượng như vậy, hoặc không gian lớn hơn, về byte, chương trình con getmem cho phép xác định điều đó. Hãy để chúng tôi viết lại ví dụ trước, sử dụng 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.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

Vì vậy, bạn có toàn quyền kiểm soát và bạn có thể chuyển bất kỳ giá trị kích thước nào trong khi cấp phát bộ nhớ không giống như mảng, nơi một khi bạn đã xác định kích thước thì không thể thay đổi.

Thay đổi kích thước và giải phóng bộ nhớ

Khi chương trình của bạn xuất hiện, hệ điều hành sẽ tự động giải phóng tất cả bộ nhớ được cấp bởi chương trình của bạn, nhưng cách tốt nhất là khi bạn không cần bộ nhớ nữa, thì bạn nên giải phóng bộ nhớ đó.

Pascal cung cấp thủ tục dispose để giải phóng một biến được tạo động bằng thủ tục new. Nếu bạn đã cấp phát bộ nhớ bằng cách sử dụng getmem chương trình con, sau đó bạn cần sử dụng chương trình con freememđể giải phóng bộ nhớ này. Các chương trình con freemem có cú pháp sau:

procedure Freemem(
   p: pointer;
  Size: PtrUInt
);

function Freemem(
   p: pointer
):PtrUInt;

Ngoài ra, bạn có thể tăng hoặc giảm kích thước của khối bộ nhớ được cấp phát bằng cách gọi hàm ReAllocMem . Hãy để chúng tôi kiểm tra các chương trình trên một lần nữa và tận dụng ReallocMemFreeMem chương trình con. Sau đây là cú pháp cho ReAllocMem :

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

Sau đây là một ví dụ mà làm cho sử dụng ReallocMemFreeMem chương trình con -

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.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Name = Zara Ali
Description: Zara ali a DPS student. She is in class 10th

Chức năng quản lý bộ nhớ

Pascal cung cấp một kho các chức năng quản lý bộ nhớ được sử dụng để triển khai các cấu trúc dữ liệu khác nhau và thực hiện lập trình cấp thấp trong Pascal. Nhiều chức năng trong số này phụ thuộc vào việc triển khai. Free Pascal cung cấp các chức năng và thủ tục sau để quản lý bộ nhớ:

SN Tên & Mô tả chức năng
1

function Addr(X: TAnytype):Pointer;

Trả về địa chỉ của biến

2

function Assigned(P: Pointer):Boolean;

Kiểm tra xem một con trỏ có hợp lệ không

3

function CompareByte(const buf1; const buf2; len: SizeInt):SizeInt;

So sánh 2 bộ đệm bộ nhớ mỗi byte

4

function CompareChar(const buf1; const buf2; len: SizeInt):SizeInt;

So sánh 2 bộ đệm bộ nhớ mỗi byte

5

function CompareDWord(const buf1; const buf2; len: SizeInt):SizeInt;

So sánh 2 bộ đệm bộ nhớ mỗi byte

6

function CompareWord(const buf1; const buf2; len: SizeInt):SizeInt;

So sánh 2 bộ đệm bộ nhớ mỗi byte

7

function Cseg: Word;

Trả về đoạn mã

số 8

procedure Dispose(P: Pointer);

Giải phóng bộ nhớ được cấp phát động

9

procedure Dispose(P: TypedPointer; Des: TProcedure);

Giải phóng bộ nhớ được cấp phát động

10

function Dseg: Word;

Trả về phân đoạn dữ liệu

11

procedure FillByte(var x; count: SizeInt; value: Byte);

Làm đầy vùng bộ nhớ với mẫu 8 bit

12

procedure FillChar( var x; count: SizeInt; Value: Byte|Boolean|Char);

Làm đầy vùng bộ nhớ với một số ký tự

13

procedure FillDWord( var x; count: SizeInt; value: DWord);

Làm đầy vùng bộ nhớ với mẫu 32 bit

14

procedure FillQWord( var x; count: SizeInt; value: QWord);

Làm đầy vùng bộ nhớ với mẫu 64 bit

15 procedure FillWord( var x; count: SizeInt; Value: Word);

Làm đầy vùng bộ nhớ với mẫu 16 bit

16

procedure Freemem( p: pointer; Size: PtrUInt);

Giải phóng bộ nhớ được cấp phát

17

procedure Freemem( p: pointer );

Giải phóng bộ nhớ được cấp phát

18

procedure Getmem( out p: pointer; Size: PtrUInt);

Cấp phát bộ nhớ mới

19

procedure Getmem( out p: pointer);

Cấp phát bộ nhớ mới

20

procedure GetMemoryManager( var MemMgr: TMemoryManager);

Trả về trình quản lý bộ nhớ hiện tại

21

function High( Arg: TypeOrVariable):TOrdinal;

Trả về chỉ số cao nhất của mảng mở hoặc được liệt kê

22

function IndexByte( const buf; len: SizeInt; b: Byte):SizeInt;

Tìm giá trị có kích thước byte trong một phạm vi bộ nhớ

23

function IndexChar( const buf; len: SizeInt; b: Char):SizeInt;

Tìm giá trị có kích thước ký tự trong một phạm vi bộ nhớ

24

function IndexDWord( const buf; len: SizeInt; b: DWord):SizeInt;

Tìm giá trị có kích thước DWord (32-bit) trong một phạm vi bộ nhớ

25

function IndexQWord( const buf; len: SizeInt; b: QWord):SizeInt;

Tìm giá trị có kích thước QWord trong một phạm vi bộ nhớ

26

function Indexword( const buf; len: SizeInt; b: Word):SizeInt;

Tìm giá trị có kích thước từ trong một phạm vi bộ nhớ

27

function IsMemoryManagerSet: Boolean;

Trình quản lý bộ nhớ có được đặt không

28

function Low( Arg: TypeOrVariable ):TOrdinal;

Trả về chỉ số thấp nhất của mảng đang mở hoặc được liệt kê

29

procedure Move( const source; var dest; count: SizeInt );

Di chuyển dữ liệu từ vị trí này trong bộ nhớ sang vị trí khác

30

procedure MoveChar0( const buf1; var buf2; len: SizeInt);

Di chuyển dữ liệu cho đến ký tự 0 đầu tiên

31

procedure New( var P: Pointer);

Tự động cấp phát bộ nhớ cho biến

32

procedure New( var P: Pointer; Cons: TProcedure);

Tự động cấp phát bộ nhớ cho biến

33

function Ofs( var X ):LongInt;

Trả về phần bù của biến

34

function ptr( sel: LongInt; off: LongInt):farpointer;

Kết hợp phân đoạn và bù đắp với con trỏ

35

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

Thay đổi kích thước khối bộ nhớ trên heap

36

function Seg( var X):LongInt;

Trả về phân đoạn

37

procedure SetMemoryManager( const MemMgr: TMemoryManager );

Đặt trình quản lý bộ nhớ

38

function Sptr: Pointer;

Trả về con trỏ ngăn xếp hiện tại

39

function Sseg: Word;

Trả về giá trị thanh ghi phân đoạn ngăn xếp