2012-03-17 39 views
10

Tôi đã thêm một số mã vào dự án delphi của mình để tương tác với sổ đăng ký, sử dụng một số hướng dẫn mà tôi tìm thấy trực tuyến để hướng dẫn nỗ lực của mình. Mỗi ví dụ tôi đã nhìn thấy dường như sử dụng cấu trúc này để truy cập registry của họ:Biến Delphi có thể chưa được khởi tạo cảnh báo

var 
    Registry: TRegistry; 
begin 
    try 
    Registry := TRegistry.Create; 
    //additional code to access and use the registry object could go here 
    finally 
    Registry.Free; 
end; 

Nhưng khi tôi thực hiện mã của tôi sau cấu trúc đó, tôi nhận được một cảnh báo rằng Registry biến của tôi có thể không có được khởi tạo trên dòng nơi tôi giải phóng đối tượng TRegistry.

Vì vậy, tôi tự hỏi liệu các ví dụ tôi đã tìm thấy chỉ là sai trên đúng cách để truy cập vào sổ đăng ký. Tôi có nên gọi miễn phí trên đối tượng TRegistry của mình bất kể Create succeeeds hay không, và chỉ bỏ qua cảnh báo? Nên, thay vào đó, thử/cuối cùng của tôi chặn chỉ bao quanh mã sau cuộc gọi hàm tạo thành công, nhưng không bị chặn cuộc gọi tạo? Thứ gì khác?

Trả lời

22

Trong mã của bạn, nếu TRegistry.Create đặt ra ngoại lệ thì biến số Registry sẽ không được chỉ định. Và do đó cuối cùng sẽ cố gắng truy cập một biến chưa được khởi tạo.

Cách chính xác để viết mã là đảm bảo rằng biến được gán trước khi bạn nhập khối try/finally.

Registry := TRegistry.Create; 
try 
    //additional code to access and use the registry object could go here 
finally 
    Registry.Free; 
end; 

Đây là mẫu quản lý lâu dài cơ bản nhất trong mã Delphi và bạn nên cam kết sâu vào bộ nhớ cơ.

Lưu ý rằng nếu hàm tạo không thành công, thì nó sẽ dọn dẹp đối tượng được xây dựng một phần trước khi truyền ngoại lệ. Tham chiếu đối tượng mới, Registry trong mã này, chỉ được gán nếu hàm tạo hoàn tất thành công.

Tôi hy vọng rằng các ví dụ bạn tìm thấy trên thực tế được viết theo mã của tôi ở trên và bạn bằng cách nào đó đã sao chép chúng không chính xác. Nếu chúng được viết theo câu hỏi, thì chúng rõ ràng là do lỗi.

+0

Tôi có cần thực hiện bất kỳ kiểm tra bổ sung nào sau khi Tạo trước khối thử để thực sự đảm bảo rằng Registry đã được khởi tạo ok không? –

+0

Và chỉ ví dụ: http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=656&lngWId=7 sẽ là một trong các loại hướng dẫn mà tôi thấy thực sự là nó xuất hiện sai, do đó, câu hỏi để thử và hiểu liệu mã đó có thực sự giống với những gì một nhà phát triển delphi nâng cao hơn sẽ làm hay không. –

+0

Rõ ràng bạn cần tìm các nguồn tốt hơn trang web đó! –

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