2011-07-04 33 views
5

Trong C#, khi tôi có hai đối tượng obj1, obj2 gồm một List<string> và tôi gán cả những đối tượng cùng một đối tượng List<string>.C bộ sưu tập # rác với đối tượng tham chiếu

Nếu tham chiếu đến obj1 của tôi nằm ngoài phạm vi nhưng tham chiếu của tôi đối với obj2 thì không, obj1 vẫn đủ điều kiện thu gom rác hay có một số vấn đề phụ thuộc vì vẫn có tham chiếu đến đối tượng List<string>?

+6

+! Câu hỏi hay, nhưng bạn vui lòng viết nó ra trong mã? – harpo

+1

Có vẻ như một câu hỏi hay, nhưng tôi không thực sự chắc chắn vì nó không rõ ràng những gì đang xảy ra với * obj1 *, * obj2 *, và các đối tượng Danh sách ... bạn có thể làm rõ? – Matt

Trả lời

3

Trong trường hợp của bạn, obj1phải đủ điều kiện để thu gom rác thải.

Bạn cần xem Jon Skeet'sanswer tại đây. Nó giải thích rõ ràng cách thức thu gom rác hoạt động trên các tham chiếu đối tượng.

Hướng dẫn hay cho bạn theo số Object's Lifetime in C#.

+0

'Danh sách 'hoặc con trỏ đến' Danh sách '? – Enigmativity

1

obj1 phải đủ điều kiện để thu thập rác miễn là không có tham chiếu đến chính obj1.

+0

Điều này đúng nếu bạn có nghĩa là con trỏ được xác định bởi 'obj1' và không phải là cá thể của' Danh sách 'được trỏ đến bởi' obj1'. – Enigmativity

+0

@Enigmativity: Tất nhiên! :) – Mrchief

-1

Nếu obj1 là thành viên của Danh sách, nó không có sẵn để thu thập rác cho đến khi Danh sách mẹ được thu thập rác.

Vì vậy:

List<string> l = new List<string>(); 

string a = "one"; 
l.Add(a); 

{ 
    string b = "two"; 
    l.Add(b); 
} 

Vào cuối của danh sách này, a là trong phạm vi, b là ra khỏi phạm vi, nhưng cả hai vẫn có tài liệu tham khảo trong danh sách l, vì vậy không có đủ điều kiện để thu gom rác thải.

+0

Không chắc chắn lý do tại sao điều này đã được bình chọn - một bình luận về lý do tại sao nó sai hoặc một câu trả lời xấu sẽ được tốt đẹp. –

1

Nếu tài liệu tham khảo của tôi để obj1 đi ra khỏi phạm vi, nhưng tài liệu tham khảo của tôi để obj2 không không, là obj1 vẫn đủ điều kiện cho thu gom rác thải, hoặc là có một số vấn đề phụ thuộc bởi vì có vẫn còn là một tham chiếu đến đối tượng Danh sách ?

Nếu tôi hiểu bạn một cách chính xác bạn có nghĩa là cả hai obj1obj2 là loại List<string> và cả điểm đến cùngList<string> dụ.

Khi obj1 vượt quá phạm vi, sẽ vẫn còn obj2 làm tham chiếu hoạt động đối với phiên bản List<string>, do đó danh sách không thể thu thập rác.

Nếu obj1 là một phần của kiểu tham chiếu trên đống (nghĩa là một trong các thuộc tính của nó), không gian bộ nhớ mà nó chiếm có thể là rác được thu thập như một phần của đối tượng bên ngoài. Nếu nó chỉ là một tham chiếu trên ngăn xếp, GC sẽ không được tham gia kể từ khi ngăn xếp sẽ chỉ được unwound vào cuối của cuộc gọi phương thức khi obj1 rơi ra khỏi phạm vi.

Hãy nhớ rằng obj1 chỉ là một tham chiếu (theo cách con trỏ) đến một đối tượng trên heap - đối tượng này có thể là rác chỉ được thu thập khi không có tham chiếu nào trỏ đến nó nữa.

0

Có ba sử dụng bộ nhớ định nghĩa trong câu hỏi này:

  • một con trỏ đến List<string> dụ gọi obj1.
  • một con trỏ đến phiên bản List<string> được gọi là obj2.
  • Ví dụ của List<string>.

nếu obj1 đi ra khỏi phạm vi, nhưng obj2 không, thì chỉ sau còn lại sau khi thu gom rác thải:

  • một con trỏ đến List<string> dụ gọi obj2.
  • Ví dụ của List<string>.

Điều quan trọng là hãy nhớ rằng C# tóm tắt đi những khái niệm về con trỏ trong hầu hết các trường hợp để bạn có thể nghĩ một cách an toàn của obj1obj2 như là List<string> và không gợi ý, nhưng con trỏ họ đang có.

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