Đặt độ dài mảng thành 0 sẽ phá hủy mảng, điều này ngược với mong muốn của bạn "giữ cho mảng được tải". Tuy nhiên, nó sẽ giải phóng bộ nhớ cho tất cả các bản ghi và chuỗi của chúng (đối với bất kỳ chuỗi nào có số tham chiếu là 1 tại thời điểm đó).
Nếu bạn chỉ muốn giải phóng bộ nhớ cho các chuỗi, nhưng giữ bộ nhớ bản ghi được phân bổ (vì bạn định phân bổ một bộ bản ghi khác ngay sau đó và bạn không muốn lãng phí việc phát hành và phân bổ lại cùng một bộ nhớ), sau đó bạn có thể xóa chỉ các thành viên chuỗi, nhưng không có cuộc gọi thư viện duy nhất để làm điều đó cho bạn. Thay vào đó, bạn sẽ cần phải viết một vòng lặp và tự xóa từng trường của bản ghi.
for i := 0 to High(transactions) do begin
transactions[i].alias := '';
transactions[i].description := '';
end;
Nếu có rất nhiều lĩnh vực trong hồ sơ cần thanh toán bù trừ, sau đó nó có thể là thuận tiện hơn để gán một giá trị mặc định TTransaction
để mỗi phần tử của mảng. Bạn có thể sử dụng Default
chức năng, hoặc trong các phiên bản cũ của Delphi bạn có thể khai báo một TTransaction
đó có tất cả các lĩnh vực của nó rõ ràng đã:
const
ClearTransaction: TTransaction = (alias: ''; description: ''; creation: 0; count: 0);
for i := 0 to High(transactions) do
transactions[i] := ClearTransaction;
// or
transactions[i] := Default(TTransaction);
Nguồn
2013-02-19 13:23:49
'Finalize' có thực sự thay đổi giá trị' a' không? Tôi luôn luôn bị ấn tượng vì nó không - nó giải phóng bộ nhớ trong khi để lại địa chỉ ban đầu của mảng động được lưu trữ trong 'a', với dự đoán của một cuộc gọi tiếp theo tới' Free' hoặc 'Initialize'. –
@Rob Đối với mảng động, ba tùy chọn này đều tương đương nhau. Đối với một loại được quản lý, Finalize phải đặt tham chiếu là 0. Nó không có sự lựa chọn. Hãy xem xét một biến cục bộ của mảng động kiểu. –
@DavidHeffernan Trong trường hợp giới hạn cao nhất của mảng là 10, thì tốt hơn nên sử dụng: 1- Đặt thành Nil và tạo lại tất cả. 2 - Liên kết các chỉ mục đã sử dụng với các giá trị tiếp theo? – EProgrammerNotFound