2 Giải phóng tài nguyên

Một phần của tài liệu BÀI GIẢNG TÓM TẮT LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG ppsx (Trang 91 - 94)

91

Chu kì sống và thời gian của một đối tượng

Điều gì xảy ra khi bạn tạo và hủy một đối tượng. Bạn tạo đối tượng như sau:

SinhVien a = new SinhVien(); // a là kiểu tham chiếu

Tiến trình tạo một đối tượng gồm hai giai đoạn. Đầu tiên, hoạt động new cấp phát bộ

nhớ thô từ heap. Bạn không thểđiều khiển giai đoạn này khi đối tượng được tạo. Thứ

hai, hoạt động new chuyển bộ nhớ thô vào trong một đối tượng; nó phải khởi tạo đối tượng. Bạn có thểđiều khiển giai đoạn này dùng phương thức tạo lập.

Khi bạn đã tạo đối tượng, bạn có thể truy xuất thành viên của nó dùng toán tử “. ”. Ví dụ:

a.Ten = "Nguyen Van A";

Bạn có thể khai báo biến tham chiếu đến cùng đối tượng: SinhVien ref = a;

Bạn có thể tạo bao nhiêu tham chiếu đến đối tượng cũng được. CLR sẽ theo dõi tất cả

những tham chiếu này. Nếu biến a biến mất (ngoài phạm vị), những biến khác (như là ref) vẫn tồn tại. Vì vậy thời gian sống của một đối tượng không bị ràng buộc vào một biến tham chiếu cụ thể. Một đối tượng chỉ có thể bị hủy khi tất cả các tham chiếu đến nó biến mất.

Tương tự như tạo, hủy đối tượng cũng gồm 2 giai đoạn. Đầu tiên, bạn phải thực hiện một số dọn dẹp được viết trong phương thức hủy. Thứ hai, bộ nhớ thô được trả lại cho heap, bạn không thể kiểm soát giai đoạn này. Quá trình hủy một đối tượng và trả bộ

nhớ lại heap được biết là cơ chế thu dọn (garbage collection).

Viết phương thức hủy

Bạn có thể sử dụng một phương thức hủy để thực hiện việc dọn dẹp khi đối tượng cần

được gom rác. Bạn viết dấu “~” theo sau bởi tên lớp. Trong ví dụ sau đếm số thể hiện của lớp bằng cách tăng biến tĩnh count trong phương thức tạo lập và giảm biến này trong phương thức hủy: class ViDu { public ViDu() { this.soTheHien++; } ~ViDu() { this.soTheHien--; }

92 {

return this.soTheHien; }

...

private static int soTheHien = 0; }

Một số hạn chế khi sử dụng phương thức tạo lập:

ƒ Bạn không thể khai báo một phương thức hủy trong cấu trúc vì cấu trúc là một kiểu giá trị lưu trên stack không phải trên heap nên không cần sử dụng cơ chế thu dọn:

struct ViDu {

~ViDu() {... } // lỗi biên dịch

}

ƒ Bạn không thể khai báo chỉđịnh truy xuất (như là public) cho phương thức hủy bởi vì bạn không thể gọi phương thức hủy, nó được gọi bởi cơ chế thu dọn.

public ~ViDu() {... } // lỗi biên dịch

ƒ Bạn không được khai báo phương thức hủy với tham số.

~ViDu(int parameter) {... } //lỗi biên dịch

ƒ Trình biên dịch tựđộng dịch phương thức hủy thành phương thức Object.Finalize. class ViDu { ~ViDu() {... } } Dịch thành: class ViDu { (adsbygoogle = window.adsbygoogle || []).push({});

protected override void Finalize() {

try {... }

finally { base.Finalize(); } }

}

Tại sao sử dụng cơ chế thu dọn

Trong C#, bạn không thể chủđộng hủy đối tượng, lý do tại sao các nhà thiết kế C# cấm bạn thực hiện điều này:

ƒ Bạn quên xóa đối tượng, điều này có nghĩa là phương thức hủy không được chạy và bộ nhớ sẽ không được thu hồi lại cho heap và bạn có thể nhanh chóng cạn kiệt bộ nhớ.

93

ƒ Khi bạn đang cố xóa một đối tượng đang hoạt động. Nhớ rằng đối tượng là kiểu tham chiếu. Nếu một lớp giữ một tham chiếu đến một đối tượng đã bị hủy. Nó có thể tham chiếu đối tượng không sử dụng hay tham chiếu đến một đối tượng hoàn toàn khác trong cùng vùng nhớ.

ƒ Bạn muốn xóa cùng đối tượng nhiều lần. Điều này có thể rất tai hại dựa trên mã trong phương thức hủy.

Cơ chế thu dọn có nhiệm vụ hủy đối tượng cho bạn và nó đảm bảo các vấn đề sau:

ƒ Mỗi đối tượng sẽ bị hủy và khi chương trình kết thúc tất cả các đối tượng đang tồn tại sẽ bị hủy.

ƒ Mỗi đối tượng chính xác bị hủy một lần.

ƒ Mỗi đối tượng bị hủy khi không còn tham chiếu đến nó.

Những đảm bảo này rất hữu ích và tiện lợi cho các lập trình viên, bạn chỉ tập trung vào phần logic của chương trình.

Một đặc trưng quan trọng nữa của cơ chế thu dọn là phương thức hủy sẽ không chạy cho tới khi đối tượng là rác cần được thu dọn. Nếu bạn viết một phương thức tạo lập, bạn sẽ biết nó sẽ chạy nhưng không biết lúc nào chạy?

Cách thức làm việc của cơ chế thu dọn

Cơ chế thu dọn chạy trên một tiến trình riêng của nó và chỉ chạy ở một thời gian nào

đó (thông thường khi ứng dụng chạy đến cuối phương thức). Khi nó chạy, các tiến trình khác đang chạy trong ứng dụng của bạn sẽ tạm thời treo, bởi vì cơ chế thu dọn cần di chuyển các đối tượng và cập nhật các tham chiếu đến các đối tượng. Cơ chế thu dọn thực hiện các bước sau:

1. Xây dựng một bản đồ của tất cả các đối tượng có thểđến được. Cơ chế thu dọn xây dựng bản đồ này rất cẩn thận vì tránh tham chiếu vòng gây ra lặp vô hạn. Bất kì đối tượng nào không có trong bản đồ này được xem là không đến được. 2. Nó kiểm tra các đối tượng không thểđến có phương thức hủy cần để chạy hay

không. Nếu có nó đưa vào trong một hàng đợi đặc biệt gọi là F-reachable. 3. Nó thu hồi các đối tượng không thểđến còn lại, bằng cách di chuyển các đối

tượng xuống dưới heap. Vì vậy sự phân mảnh và giải phóng bộ nhớởđầu heap. Khi cơ chế thu dọn di chuyển một đối tượng, nó cũng cập nhật tất cả tham chiếu

đến đối tượng này.

4. Ở thời điểm này, nó cho phép các tiến trình khác chạy lại.

5. Nó thu hồi các đối tượng trong F-reachable trong một tiến trình độc lập.

Một phần của tài liệu BÀI GIẢNG TÓM TẮT LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG ppsx (Trang 91 - 94)