2012-05-18 22 views
10

Gần đây tôi đã xem xét một số mã sử dụng SetLength để cấp phát bộ nhớ cho một mảng byte, nhưng tôi không thấy bất kỳ logic nào để giải phóng không gian bộ nhớ đó. Tôi đã đọc điều đó cho một mảng byte, bạn nên thiết lập giá trị thành nil hoặc sử dụng Finalize?Khi sử dụng SetLength() trong Delphi, cách thích hợp để giải quyết bộ nhớ đó là gì?

cách tốt nhất để xử lý này ... Dựa trên những gì tôi thấy nó cho thấy một cái gì đó như sau là gì ...

var 
    x: array of byte; 
begin 
    SetLength(x, 30); 
    // Do something here 
    : 
    // Release the array 
    x := nil; 
    Finalize(x); 
end; 

Trả lời

23

Thông thường, bạn không cần phải giải phóng bộ nhớ ở tất cả, vì điều này được thực hiện tự động khi số nhận dạng (trong trường hợp này là x) nằm ngoài phạm vi. Do đó, hai dòng cuối cùng trong mã của bạn hoàn toàn vô nghĩa.

Nếu, tuy nhiên, bạn có số nhận dạng không nằm ngoài phạm vi cho đến khi chương trình của bạn đóng, sau đó bạn có thể muốn giải phóng bộ nhớ được kết hợp theo cách thủ công. Đặc biệt, bạn có thể muốn làm điều này nếu số nhận dạng là một hình ảnh bitmap lớn hoặc giống như vậy. Sau đó, bạn có thể làm x := nil, SetLength(x, 0) hoặc điều gì đó tương tự.

9

Mảng động là các loại được quản lý. Điều này có nghĩa là trình biên dịch sẽ vứt bỏ bộ nhớ khi tham chiếu cuối cùng tới mảng đó nằm ngoài phạm vi. Điều đó có nghĩa rằng mã để giải phóng mảng trong mã của bạn là khá vô nghĩa.

Nếu bạn cần, bạn có thể deallocate mảng trước thời hạn bằng cách sử dụng bất kỳ của những dòng này tương đương với mã:

SetLength(x, 0); 
Finalize(x); 
x := nil; 

Ghi chú rằng nếu bạn có tài liệu tham khảo mutiple đến cùng một mảng thì bạn cần phải làm điều này cho tất cả các tham chiếu đến mảng đó.

Các vấn đề liên quan