Hàm hủy trong c++

Hàm destructor (hàm hủy) là 1 trong những loại hàm thành viên đặc biệt quan trọng không giống của class, được thực hiện lúc 1 đối tượng người dùng của class kia bị diệt. Trong lúc các hàm constructors (hàm khởi tạo) được thiết kế để có thể tạo một class, thì các hàm destructors (hàm hủy) có thiết kế để cung cấp vấn đề dọn dẹp bộ nhớ.

Bạn đang xem: Hàm hủy trong c++

Khi một đối tượng người sử dụng nằm ngoại trừ phạm vi vùng code nhưng mà lịch trình đang chạy một cách bình thường, hoặc lúc một đối tượng người sử dụng được cấp phát rượu cồn bị xóa khỏi một giải pháp tường minch bởi tự khóa delete, thì hàm destuctor của class vẫn tự động hóa được call (giả dụ nó tồn tại) nhằm tiến hành ngẫu nhiên câu hỏi dọn dẹp bộ nhớ quan trọng làm sao trước khi xóa sổ đổi tượng ngoài bộ lưu trữ. Đối với các class đơn giản và dễ dàng (các class nhưng mà chỉ khởi tạo quý hiếm của những biến thành viên thuộc các kiểu dáng dữ liệu cơ bản) thì không nhất thiết phải sử dụng hàm destructor bởi vì C++ đã auto dọn dẹp và sắp xếp bộ lưu trữ cho mình.

Tuy nhiên, trường hợp đối tượng người sử dụng ở trong class của công ty sẽ nắm giữ ngẫu nhiên tài nguim làm sao (ví dụ như: bộ nhớ đụng, hoặc một file, tốt database handle) cần phải giải pđợi, hoặc nếu bạn phải triển khai bất kỳ tác vụ duy trì làm sao trước khi đối tượng người sử dụng bị hủy, thì hàm destructor chính là địa điểm tuyệt vời và hoàn hảo nhất để gia công đa số điều đó, bởi vì nó thường xuyên là khu vực nhưng code được triển khai sau cuối, trước khi đối tượng người tiêu dùng bị diệt.


Nội dung chính


1. Việc đánh tên cho hàm destructor

Giống nhỏng các hàm constructor, những hàm destructors cũng có thể có những quy tắc khắc tên riêng:


Hàm destructor bắt buộc tất cả cùng thương hiệu cùng với class, và thêm lốt bổ làm cho tiền tố.Hàm destructor thiết yếu dìm vào những đối số.Hàm destructor không có đẳng cấp dữ liệu trả về.

Lưu ý, Chỉ trường thọ độc nhất vô nhị một hàm destructor phía bên trong từng class, cho nên vì vậy không có phương pháp như thế nào để overload (nạp chồng) những hàm destructors, chính vì bọn chúng cần yếu được phân minh với nhau dựa vào các đối số truyền vào.

Nói tầm thường bạn ko nên được gọi tường minc bất kể hàm destructor làm sao (chính vì bọn chúng sẽ được Điện thoại tư vấn auto Khi đối tượng người sử dụng bị diệt đi), bởi vì rất hiếm Lúc chạm mặt đề xuất phần lớn trường phù hợp yêu cầu dọn dẹp và sắp xếp một đối tượng nhiều hơn một đợt. Tuy nhiên, những hàm destructor hoàn toàn có thể Điện thoại tư vấn mang đến những hàm thành viên khác một bí quyết bình yên, bởi vì đối tượng người tiêu dùng vẫn không biến thành hủy cho đến sau khoản thời gian hàm destructor được thực hiện kết thúc.

2. Một ví dụ về hàm destructor

Chúng ta thuộc xem một class đơn giản có thực hiện hàm destructor:

/*** nayaritas.net - Kênh biết tin IT bậc nhất Việt Nam**
author nayaritas.netn* Contact: nayaritas.netn

Nếu bạn test biên dịch đoạn code bên trên với bị lỗi sau:


If you compile the above example và get the following error:error: "class IntArray" has pointer data members <-Werror=effc++>|error: but does not override "IntArray(const IntArray&)" <-Werror=effc++>|error: or "operator=(const IntArray&)" <-Werror=effc++>|Để tự khắc phúc lỗi này, bạn có thể sa thải cờ “-Weffc++” khỏi compile settings (các cấu hình thiết lập về biên dịch) mang lại ví dụ này, Hay là chúng ta cũng có thể thêm hai loại code sau vào trong class IntArray:

IntArray(const IntArray&) = delete;IntArray& operator=(const IntArray&) = delete;Chúng ta vẫn bàn luận về tác dụng của nhì câu lệnh này trong cmùi hương sau.

Đoạn chương trình bên trên vẫn in ra:

The value of element 5 is: 6Trên mẫu thứ nhất, bọn họ đang khởi chế tạo ra một đối tượng mới của class IntArray, được Call là ar, cùng truyền vào độ nhiều năm mảng là 10. Việc khởi chế tạo ra này đã gọi mang đến hàm constructor nhằm mục tiêu cấp phép bộ nhớ lưu trữ hễ cho những biến thành viên của class IntArray. Chúng ta phải sử dụng cấp phát rượu cồn tại trên đây chính vì chúng ta không thể hiểu rằng tại thời khắc biên dịch (compile time) thì độ dài của mảng là từng nào (caller – đối tượng người sử dụng gọi hàm đã đưa ra quyết định điều đó).

Xem thêm: " Try On Là Gì - Nghĩa Của Từ Try

lúc hàm main() xong xuôi, lúc này đối tượng người dùng ar đang nằm bên cạnh phạm vi đoạn code mà lại công tác đang chạy trên kia (tức là ar đang goes out of scope). Vấn đề này vẫn làm cho hàm destructor ~IntArray() được call, nhằm xóa đi mảng cơ mà chúng ta đã cấp phát phía bên trong phần thân hàm của constructor!

3. Tính tân oán thời gian hotline hàm constructor với hàm destructor

Như vẫn nói trước đó, hàm constructor sẽ được điện thoại tư vấn khi 1 đối tượng người sử dụng được tạo ra, cùng hàm destructor sẽ tiến hành call lúc 1 đối tượng người sử dụng bị diệt đi. Trong ví dụ tiếp sau đây, họ đang áp dụng câu lệnh cout bên trong hàm constructor cùng hàm destructor để gia công rõ điều này:

/*** nayaritas.net - Kênh lên tiếng IT hàng đầu Việt Nam**
author nayaritas.netn* Contact: nayaritas.netn

Constructing Simple 11Constructing Simple 22Destructing Simple 2Destructing Simple 1Lưu ý rằng “Simple 1” bị diệt trước “Simple 2” cũng chính vì bọn họ sẽ xóa đối tượng người tiêu dùng pSimple trước lúc hàm main() chấm dứt, trong những lúc đối tượng người tiêu dùng simple chỉ bị bỏ đi sau khi hàm main() vẫn ngừng rồi.

Các đổi thay toàn cục phía bên trong class thì hầu hết được khởi tạo/xây dựng trước khi

hàm main() được triển khai, với được bỏ đi sau khi hàm main() sẽ hoàn thành rồi.


4. RAII

RAII (Resoure Acquisition Is Initialization – nhất thời dịch, Việc thu hồi tài ngulặng đó là khi khởi tạo) là một trong những nghệ thuật xây dựng nhưng mà trong những số đó câu hỏi áp dụng tài nguim được gắn liền với vòng đời của các đối tượng người tiêu dùng tất cả thời lượng tồn tại được giải pháp xử lý auto (ví dụ, non-dynamically allocated objects – các đối tượng người dùng được cấp phép tĩnh). Trong C++, RAII được cài đặt trải qua những classes với các hàm constructors với destructors. Một tài nguim (chẳng hạn như bộ nhớ, một tệp tin, tuyệt database handle, v.v…) hay được thu thập bên trong phần thân hàm của constructor của đối tượng người tiêu dùng (tuy nhiên nó hoàn toàn có thể được thu thập sau thời điểm đối tượng được tạo ra, giả dụ điều này thích hợp lý). Tài nguyên ổn này sau đó có thể được áp dụng trong lúc đối tượng người sử dụng đang còn sinh sống. khi đối tượng người dùng bị bỏ, tài nguyên này cũng trở thành được giải phóng phía bên trong hàm destructor. Ưu điểm bao gồm của RAII là nó góp ngăn chặn bài toán rò rỉ tài nguyên ổn (ví dụ: Sở nhớ không được giải phóng) Lúc toàn bộ các đối tượng người dùng đang sở hữu tài nguim đa số được dọn dẹp không bẩn một giải pháp tự động hóa.

Theo mô hình RAII, các đối tượng người sử dụng đang sở hữu tài nguim không nên được cấp phép hễ. Điều này là vì những hàm destructors chỉ được điện thoại tư vấn khi 1 đối tượng được bỏ đi. Đối với những đối tượng được cấp phép bên trên vùng nhớ staông xã, vấn đề này đã tự động diễn ra lúc đối tượng ở không tính phạm vi đoạn code cơ mà lịch trình đang hoạt động bên trên đó (goes out of scope), cho nên, không cần phải băn khoăn lo lắng về câu hỏi những tài nguyên ổn cho tới thời khắc sau cuối đã đạt được dọn dẹp và sắp xếp sạch sẽ hay không. Tuy nhiên, so với những đối tượng người tiêu dùng được cấp phép rượu cồn, người dùng/lập trình sẵn viên bắt buộc tất cả trách rưới nhiệm giải pngóng các tài ngulặng sau khoản thời gian sẽ sử dụng chấm dứt – Nếu quên làm cho điều đó, thì hàm destructor sẽ không được Hotline, dẫn tới việc phần bộ nhớ lưu trữ giành riêng cho đối tượng người dùng của class cùng tài ngulặng mà nó đã cai quản lý/nắm giữ bị rò rỉ!

Class IntA làm việc đầu bài học kinh nghiệm này là 1 trong những ví dụ về một class có thiết lập RAII – tiến hành cấp phép bộ nhớ lưu trữ bên phía trong hàm constructor, cùng giải pđợi bộ lưu trữ bên phía trong hàm destructor. std::string cùng std::vector là các ví dụ về số đông class bên trong thư viện standard cơ mà tuân thủ theo đúng RAII – bộ nhớ động được đem khi khởi tạo thành, và được tự động hóa dọn không bẩn Khi thực thi quá trình bỏ.

Quy tắc: Nếu class của chúng ta buộc phải cấp phát bộ lưu trữ hễ, hãy sử dụng mô hình RAII, chđọng không nên cấp phát cồn thẳng mang đến phần lớn đối tượng người dùng của class của người tiêu dùng.

5. Lưu ý về hàm exit()

Hãy để ý rằng nếu như áp dụng hàm exit(), chương trình của bạn sẽ xong xuôi cùng vẫn không có hàm destructors nào được Gọi. Hãy thận trọng nếu như bạn sẽ thực hiện và nhờ vào các hàm destructors nhằm tiến hành những các bước lau chùi và vệ sinh quan trọng (ví dụ như: Viết gì đấy vào trong 1 file log hoặc các đại lý dữ liệu, trước khi bay chương trình).

6. Tổng kết

quý khách hàng thấy đấy, khi các hàm constructors và những hàm destructors được sử dụng cùng nhau, những class của bạn sẽ auto khởi sinh sản cùng vệ sinh sau thời điểm bọn chúng được áp dụng dứt mà lại ko buộc phải lập trình viên buộc phải tiến hành bất kỳ các bước đặc trưng nào! Điều này làm cho sút tỷ lệ tạo thành bug (lỗi), với làm cho cho những class dễ dàng sử dụng hơn.