2012-05-27 32 views
9

Tôi đang đọc Andrei Alexandrescu của D Ngôn ngữ lập trình và thấy nugget này trong chuỗi giọt nước mắt xuống:D: Đảm bảo Tiêu hủy

... D giả định thoát khỏi ứng dụng sẽ de facto miễn phí tất cả các tài nguyên liên kết với nó, do đó, nó không gọi bất kỳ destructor.

Điều này phù hợp với tài nguyên bộ nhớ, nhưng còn những thứ như ổ cắm mạng, phần cứng tùy chỉnh, xử lý tệp, v.v ... thì sao? Có cách nào để đảm bảo rằng destructor của tôi là luôn luôn được gọi là? Cách khác: D có cung cấp cách xử lý tốt hơn những thứ này (và tôi bị kẹt trong tư duy C++) không?

+0

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ý. –

+0

@ 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. –

+0

@TravisGockel bạn có thể vui lòng chỉnh sửa câu hỏi để bao gồm số trang không? – Arlen

Trả lời

6

Bạn có thể sử dụng một static destructor mà được kêu gọi chấm dứt chủ đề và shared static destructor mà được kêu gọi (bình thường) ứng dụng tắt máy

(Bây giờ nếu chỉ chúng tôi đã có tài liệu tham khảo yếu vì vậy chúng tôi sẽ không cần một mức gián tiếp. ..)

3

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ỳ.

0
  • Giết các quy trình làm sạch mọi thứ bên trong quy trình.
  • Không có cách nào để ngăn chặn hệ điều hành giết chết một quá trình trước khi nó có thời gian để làm sạch những thứ bên ngoài quá trình (và nếu có, mất điện sẽ ghi đè ngay cả khi đó).

Giữa hai trong số đó, tất cả mọi thứ được đề cập để bạn có thể nói rằng bạn tắt tiếng như thế nào.

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