Con trỏ: BỘ NHỚ HEAP
Các biến động do New tạo ra được Pascal xếp vào một vùng ô nhớ tự do theo kiểu xếp chồng và được gọi là Heap ( bộ nhớ cấp phát động ). Ngôn ngữ Pascal quản lý Heap thông qua một con trỏ của Heap là HeapPtr. Con trỏ của Heap luôn luôn trỏ vào ô nhớ tự do đầu tiên của vùng ô nhớ tự do của Heap. Mỗi lần gọi New, con trỏ của Heap được dịch chuyển về phía đỉnh của vùng ô nhớ tự do một số byte tương ứng với kích thước của biến động mới được tạo ra.
Ngược lại, mỗi khi giải phóng bộ nhớ biến động, bộ nhớ biến động được thu hồi. Tuy nhiên nếu việc tạo và thu hồi không phải là quá trình liên tục và kế cận thì bản thân của vùng nhớ Heap cũng bị chia nát ra. Nghĩa là có thể có những vùng thu hồi nằm lọt trong vùng các biến động khác vẫn còn đang hoạt động. Turbo Pascal không có cơ chế dồn các biến động đang được sử dụng để gom về những vùng ô nhớ tự do.
Thí dụ khi bạn gọi :
New ( P ) ;
New ( Q ) ;
New ( R ) :
Dispose ( Q ) ;
Nghĩa là có 3 vùng nhớ kế cận nhau dành cho các biến động P^, Q^ và R^. Song đột nhiên vùng nhớ Q^ bị đòi lại làm cho xuất hiện một lỗ thủng do biến Q^ tạo ra. Turbo Pascal vẫn có cơ chế để quản lý vùng nhớ vừa giải phóng để cho các biến động mới được tạo ra có thể được xếp vào những lổ hổng đó nếu vừa kích thước ( bé hơn hoặc bằng ).
Một điều bạn quan tâm là khi tạo biến động, liệu máy có cần bộ nhớ cho nó không. Turbo Pascal cung cấp hai hàm : MemAvail và MaxAvail. Hàm MemAvail giúp bạn xác định kích thước của tất cả các vùng nhớ cấp cho biến động còn tự do, nghĩa là tổng tất cả các khối nhớ tự do, bao gồm cả các khối nhớ lổ hổng nằm xen kẽ nhau trong Heap. Hàm MaxAvail thì báo cho biết kích thước của khối nhớ Heap tự do lớn nhất. Mỗi khi bạn tạo biến động mới, máy luôn luôn cần biết liệu có còn một khối nhớ tự do nào đủ để " nhét " biến mới vào không. Hãy xem thí dụ dưới đây về cách dùng hai hàm này :
Program Get_Heap_Space ;
Uses Crt ;
Var
Tong_Heap, Khoi_lon_nhat : LongInt ;
BEGIN
Tong_Heap := MemAvail ;
Khoi_lon_nhat := MaxAvail ;
Writeln (' Tong cac vung tu do cua Heap la ', Tong_Heap,' bytes ') ;
Writeln (' Khoi Heap tu do lon nhat la ', Khoi_lon_nhat,' bytes ') ;
END.
Kết quả sẽ tùy vào máy của người sử dụng :
Tong cac vung tu do cua Heap la 10200 bytes.
Khoi Heap tu do lon nhat la 600 bytes.
Mỗi khi tạo biến động mới bạn cũng nên kiểm tra xem máy có đủ bộ nhớ cấp cho nó không. Hãy sử dụng hàm SizeOf để xác định kích thước biến nhớ bạn cần tạo ra :
Ví dụ:
Program Check_Heap_Space ;
Uses Crt ;
Type
RecPtrType = ^RecordType ;
RecordType = Record
ID : String[ 5 ] ; (* Số CMND *)
Ten : String[ 20 ] ;
Tuoi : Byte ;
End ;
Var
Ptr : RecPtrType ;
BEGIN
Ptr := Nil ;
Writeln (' Kich thuoc cua ban ghi la ', SizeOf( RecordType ),' bytes ' ) ;
Writeln (' Tong cac vung tu do cua Heap la ', MemAvail,' bytes ') ;
Writeln (' Khoi Heap tu do lon nhat la ', MaxAvail,' bytes ') ;
If MaxAvail < SizeOf( RecPtrType ) Then
Writeln (' Khong du bo nho !') ;
Else
New ( RecPtr ) ;
...
Dispose ( RecPtr ) ;
RecPtr := Nil ;
END.
Đỗ Trung Thành @ 10:48 13/09/2009
Số lượt xem: 1633
- Con trỏ: THỦ TỤC DISPOSE (13/09/09)
- Con trỏ: THỦ TỤC NEW (13/09/09)
- Con trỏ: ĐỊNH NGHĨA (13/09/09)
- Dữ liệu kiểu tệp: TỆP KHÔNG ĐỊNH KIỂU (13/09/09)
- Dữ liệu kiểu tệp: TỆP VĂN BẢN (13/09/09)

Các ý kiến mới nhất