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 ReallocMem và FreeMem 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 ReallocMem và FreeMem 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 |