Destructor (lập trình máy tính) – Wikipedia

Trong lập trình hướng đối tượng, một hàm hủy (đôi khi viết tắt dtor [1]) là một phương thức được tự động gọi khi đối tượng bị phá hủy. [2] bị ràng buộc với phạm vi và việc thực thi rời khỏi phạm vi, khi nó được nhúng vào một đối tượng khác có thời gian kết thúc hoặc khi nó được phân bổ động và được phát hành rõ ràng. Mục đích chính của nó là giải phóng các tài nguyên (cấp phát bộ nhớ, mở tệp hoặc ổ cắm, kết nối cơ sở dữ liệu, khóa tài nguyên, v.v.) mà đối tượng có được trong suốt vòng đời của nó và / hoặc hủy đăng ký khỏi các thực thể khác có thể liên quan đến nó. Việc sử dụng các hàm hủy là cần thiết cho quá trình Thu nhận tài nguyên là khởi tạo (RAII).

Trong một ngôn ngữ có cơ chế thu gom rác tự động, sẽ rất khó để đảm bảo chắc chắn việc gọi một hàm hủy và do đó các ngôn ngữ này thường được coi là không phù hợp với RAII. Trong các ngôn ngữ như vậy, việc hủy liên kết một đối tượng khỏi các tài nguyên hiện có phải được thực hiện bằng một cuộc gọi rõ ràng của một chức năng thích hợp (thường được gọi là Dispose () ). Phương pháp này cũng được khuyến nghị để giải phóng tài nguyên, thay vì sử dụng các công cụ hoàn thiện cho việc đó.

Cú pháp hủy diệt [ chỉnh sửa ]

  • Trong C ++, các hàm hủy có cùng tên với lớp mà chúng được liên kết, nhưng có tiền tố dấu ngã (~). [2]
  • D, các hàm hủy được khai báo với tên ~ this () (trong khi các hàm tạo được khai báo với this () ).
  • Trong Object Pascal, các hàm hủy có từ khóa và có thể có tên do người dùng định nghĩa, nhưng hầu hết được đặt tên là Phá hủy .
  • Trong Objective-C, phương thức hủy diệt được đặt tên là dealloc .
  • Trong Perl, the phương pháp phá hủy được đặt tên DESTROY ; trong phần mở rộng hệ thống đối tượng Moose, nó được đặt tên là DEMOLISH .
  • Trong PHP 5, phương thức hủy diệt được đặt tên là __ phá hủy . Không có hàm hủy trong các phiên bản trước của PHP. [3]
  • Trong Python có __ del __ được gọi là các hàm hủy theo hướng dẫn ngôn ngữ Python 2, [4] các công cụ hoàn thiện như đã thừa nhận trong Python 3. [5]
  • Trong Swift, phương thức hủy diệt được đặt tên là deinit .

Kẻ hủy diệt có cùng tên với lớp, nhưng với một dấu ngã (~) trước nó. [2] Ví dụ, một lớp được gọi là foo sẽ có hàm hủy ~ foo () . Ngoài ra, các hàm hủy không có các tham số cũng như các kiểu trả về. [2] Như đã nói ở trên, một hàm hủy cho một đối tượng được gọi bất cứ khi nào vòng đời của đối tượng kết thúc. [2] Nếu đối tượng được tạo như một biến tự động, thời gian tồn tại của nó sẽ kết thúc được gọi tự động khi đối tượng đi ra khỏi phạm vi. Bởi vì C ++ không có bộ sưu tập rác, nếu đối tượng được tạo bằng câu lệnh mới (tự động trên heap), thì hàm hủy của nó được gọi khi xóa toán tử được áp dụng cho một con trỏ đến đối tượng. Thông thường hoạt động đó xảy ra trong một hàm hủy khác, điển hình là hàm hủy của đối tượng con trỏ thông minh.

Trong hệ thống phân cấp thừa kế, việc khai báo một hàm hủy ảo trong lớp cơ sở đảm bảo rằng các hàm hủy của các lớp dẫn xuất được gọi đúng khi một đối tượng bị xóa thông qua lớp con trỏ đến lớp cơ sở. Các đối tượng có thể bị xóa theo cách này cần phải kế thừa một hàm hủy ảo.

Một kẻ hủy diệt không bao giờ nên ném ngoại lệ. [6]

Ví dụ [ chỉnh sửa ]

 #include    #include     class   foo_t   19659037] người bạn   std  ::  lasream   &   toán tử   <<   (  std  ::    os   foo_t   const   &   foo  )  	 { 		 os   <<   foo   19659019] dữ liệu ;  		 return   os ;  	}   	 foo_t  (  foo_t   const   &   )   =   xóa ;                 // vô hiệu hóa bản sao xây dựng  	 foo_t  &   toán tử   =   (  foo_t   19659041] &   khác  )   =   xóa ;    // vô hiệu hóa chuyển nhượng    private :  	 char   * [19659038] dữ liệu ;    công khai :  	 foo_t  (  void  )  :   dữ liệu  (  char  [  14  ]  )   {  std  ::  strcpy  (  data  Xin chào, Thế giới! " );  }   	 ~  foo_t  (  void  )   {  xóa   [] ] dữ liệu ;  }  };     int   main  ()   { 	 foo_t   foo ; ] ::  cout   <<   foo   <<   ' n' ;  	 trở lại   0 ;  }  

] Các đối tượng không thể được sao chép và / hoặc gán một cách an toàn nên bị vô hiệu hóa khỏi ngữ nghĩa đó bằng cách khai báo các chức năng tương ứng của chúng như bị xóa trong một mức đóng gói công khai. Một mô tả chi tiết về phương pháp này có thể được tìm thấy trong cuốn sách nổi tiếng của Scott Meyers, C ++ hiện đại hiệu quả (Mục 11: "Thích các chức năng bị xóa đối với các chức năng không xác định riêng tư." [7]).

Trong C có phần mở rộng GCC [ chỉnh sửa ]

Trình biên dịch C của Bộ sưu tập GNU Compiler đi kèm với 2 phần mở rộng cho phép thực hiện các hàm hủy:

  • Thuộc tính hàm hàm hủy [8] cho phép xác định các hàm hủy ưu tiên toàn cầu: khi main () trả về, các hàm này được gọi theo thứ tự ưu tiên trước khi quá trình kết thúc. Xem thêm: Hacking nghệ thuật khai thác . [9]
  • Thuộc tính biến dọn dẹp cho phép gắn hàm hủy vào một biến: hàm được gọi khi biến đi ra khỏi phạm vi.

Công cụ phá hủy trong Xojo (REALbasic) có thể ở một trong hai dạng. Mỗi biểu mẫu sử dụng một khai báo phương thức thông thường với một tên đặc biệt (không có tham số và không có giá trị trả về). Biểu mẫu cũ hơn sử dụng cùng tên với Class với tiền tố ~ (dấu ngã). Mẫu mới hơn sử dụng tên Destructor . Hình thức mới hơn được ưa thích vì nó giúp tái cấu trúc lớp dễ dàng hơn.

 Lớp Foobar   // Dạng cũ   Sub ~ Foobar ()   Kết thúc phụ    // Hình thức mới   Sub Destructor ()   Kết thúc phụ Lớp cuối 

Xem thêm [ chỉnh sửa ]

Tài liệu tham khảo [ chỉnh sửa ]