2010-10-21 40 views

Trả lời

13

Phần trích dẫn từ Delphi 7 giúp đỡ, "Đối với một dài chuỗi hoặc biến động-mảng, SetLength reallocates chuỗi hoặc mảng tham chiếu bởi S với độ dài nhất định. Ký tự hiện tại chuỗi hoặc các yếu tố trong mảng Một ngoại lệ là khi tăng chiều dài của một mảng động, trong đó các phần tử là các kiểu phải được khởi tạo (các chuỗi, các biến thể, các mảng biến thể, hoặc các bản ghi có chứa các phần tử đó). Khi S là một mảng động các loại phải được khởi tạo, không gian được phân bổ mới được đặt thành 0 hoặc nil. "

Từ quan sát của tôi, đối với mảng tĩnh, các phần tử chưa được khởi tạo chứa dữ liệu ngẫu nhiên. Đối với mảng động, AFAIK từ Delphi 7, các phần tử chưa được khởi tạo chứa giá trị mặc định không có giá trị. Tuy nhiên, bạn không nên dựa vào thực tế này bởi vì nó đã được thực hiện chi tiết của SetLength. Bạn nên làm theo các tài liệu chính thức để thay thế.

+0

-1 điều này là không đúng trong Delphi 7 - bất cứ điều gì doc nói, mã trong System.pas DOES khởi tạo dữ liệu mảng động với số không byte –

+4

Bạn có thể đảm bảo một hành vi như vậy sẽ vẫn như bây giờ trong các phiên bản tương lai của Delphi? Đối với bình luận của bạn về Delphi 7, xin vui lòng đọc đoạn thứ hai. – Vantomex

+0

Để tránh bất kỳ hồi quy nào trong các ứng dụng hiện có, tôi không thể đảm bảo EMB không thể thay đổi mã ... nhưng chúng khá thận trọng về những suy nghĩ như vậy ...họ biết rằng rất nhiều mã dựa vào hành vi không có giấy tờ này. Kể từ khi Delphi 5/6/7 ... 2010/XE system.pas mã là trong pascal tinh khiết, và rất dễ dàng để chuyển đổi sang 64 bit (chuyển đổi PChar để NativeInt hoặc như vậy), tôi không tìm thấy bất kỳ lý do tại sao họ nên thay đổi việc triển khai trong tương lai: điền tất cả bộ nhớ mới cùng một lúc nhanh hơn khởi tạo chuỗi riêng lẻ, các biến thể và như vậy. –

7

Thực tế, nó được khởi tạo bằng 0.

Phương thức SetLength gọi nội bộ System.DynArraySetLength.
Sử dụng Delphi 5, bộ nhớ được lấp đầy với #0.

// Set the new memory to all zero bits 
FillChar((PChar(p) + elSize * oldLength)^, elSize * (newLength - oldLength), 0); 

Tôi cho rằng hành vi này không thay đổi trong các phiên bản gần đây của Delphi.

+0

+1 điều này đúng trong Delphi 7 - bất kể tài liệu nào nói, mã trong System.pas DOES khởi tạo dữ liệu mảng động với byte không. –

+1

Đúng nhưng bạn thực sự không thể dựa vào điều đó. Nó không phải là một phần của các thông số kỹ thuật (trái với các loại được khởi tạo) và có thể thay đổi mà không cần thông báo. –

+0

Đúng nhưng thay thế là gì? Tự khởi tạo nó, biết rằng đó là một sự lãng phí thời gian? Tôi sẽ dựa vào nó và thêm một testcase xác minh nó mỗi ngày với các bản dựng hàng ngày của chúng tôi. Nếu nó thay đổi (mà không cần thông báo), việc xây dựng hàng ngày chọn nó lên. –

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