2013-06-04 30 views
6

Tôi muốn sửa lỗi thiết kế trong bản ghi TMyValue đã được sử dụng trong nhiều năm và tôi rất muốn sửa nó trong bản ghi - để tránh thay đổi giao diện công cộng - và không yêu cầu mã sử dụng hồ sơ được thay đổi.Đảm bảo khởi tạo bản ghi ngăn xếp

Về cơ bản, lỗ hổng là TMyValue phải được khởi tạo bằng 0 khi nó được tạo, nếu không gọi phương thức Clear trên đó có thể gây ra sự cố. Điều này là bởi vì nó chứa một trường là một con trỏ đến bộ nhớ được cấp phát động nếu con trỏ không phải là số không, và Clear làm cho bộ nhớ động được giải phóng.

Đây là vấn đề nếu TMyValue được tạo trên ngăn xếp, vì các biến ngăn xếp không được tự động xóa khi chúng được tạo.

Tôi nghĩ rằng tôi có thể sử dụng một nhà xây dựng bản ghi để không ra kỷ lục, nhưng các nhà xây dựng bản ghi không thể không có tham số. Có lẽ điều này có nghĩa là bạn không thể ép buộc một hàm tạo bản ghi được thực hiện tự động khi một bản ghi được tạo trên ngăn xếp.

Tôi nghi ngờ câu trả lời cho câu hỏi của mình là "không thể thực hiện được". Hãy chứng minh tôi sai!

Trả lời

7

Thêm thành viên chuỗi giả vào hồ sơ của bạn. Vì một chuỗi là một loại được quản lý, nó sẽ được khởi tạo thành một chuỗi rỗng khi bản ghi có trong phạm vi.

Vì vậy, khi gọi phương thức Clear, hãy kiểm tra xem chuỗi giả có trống không trước. Đặt chuỗi thành giá trị khi thích hợp với logic sử dụng để đánh dấu bản ghi được khởi tạo.

+0

Tốt. Tôi luôn thích làm cho trình biên dịch giúp cuộc sống của bạn dễ dàng hơn. –

+1

@MarjanVenema, biết một số thủ thuật luôn tốt. Nhưng việc có thể tuyên bố một thói quen khởi tạo/hoàn thiện hồ sơ đã được thực hiện từ nhiều năm trước. Xem [QC21729 Overload Operator Overloading: Vui lòng thực hiện "Initialize" và "Finalize" operator'] (http://qc.embarcadero.com/wc/qcmain.aspx?d=21729). Tôi muốn thêm rằng tất cả các thủ tục nội tại cũng sẽ có thể được sử dụng trên hồ sơ với các nhà khai thác lớp. Ý tôi là Copy, High, Low, Length, SetLength, vv .. –

+0

Oh yeah! Bỏ phiếu khi tôi nhập ... –

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