Những người khác đã đề cập đến các trình phá hủy cấp mô-đun, nhưng điều đó không thực tế vì nó đòi hỏi quá nhiều bảo trì thủ công, và D có một quirk khó chịu là các mô-đun với các nhà xây dựng tĩnh/destructors không thể nhập khẩu tuần hoàn. Ví dụ:
Module Một
module A;
import B;
static ~this() {}
void main() {}
Module B
module B;
import A;
static ~this() {}
Cố gắng chạy ...
% dmd A.d B.d
% ./A
Cycle detected between modules with ctors/dtors:
A -> B -> A
[email protected]/rt/minfo.d(331): Aborting!
D thực hiện điều này chỉ trong trường hợp các destructors của bạn xảy ra để phụ thuộc vào nhau, ngay cả khi họ không. Điều này buộc bạn phải làm "tái cấu trúc" mã lạ của bạn để làm việc xung quanh vấn đề này. Không có cách nào để nói với D rằng không thực sự là một sự phụ thuộc.
Một giải pháp tốt hơn để xử lý phá hủy tài nguyên là thử và phạm vi càng nhiều càng tốt. Không có tài nguyên toàn cầu yêu cầu tiêu hủy và không dựa vào trình phân tích lớp học cho bất kỳ điều gì vì chúng không được đảm bảo chạy bao giờ (Java có cùng vấn đề).
Ngoài ra, hãy làm những việc giống như trong C: tắt thủ công. Đó là một chút công việc hơn, nhưng thực sự không phải là một vấn đề lớn. Nó chắc chắn dễ dàng hơn đấu vật với nhập khẩu theo chu kỳ.
Nguồn
2012-05-27 14:53:20
Trong ** C++ ** có một trường hợp tương tự trong trường hợp ngoại lệ chưa được xử lý. –
@ K-ballo: Đúng, nhưng trong khi thoát ứng dụng * bình thường *, tôi dường như không thể đảm bảo rằng tất cả các đối tượng của tôi sẽ bị hủy. Điều này khá bất tiện. –
@TravisGockel bạn có thể vui lòng chỉnh sửa câu hỏi để bao gồm số trang không? – Arlen