2012-09-07 88 views
25

tôi đã được tìm kiếm thông qua và chơi với các tính năng khác nhau của C++ 11, đặc biệt là trong Visual Studio 2010.Garbage Collection trong C++ 11

Một trong những điều được đề cập là minimal garbage collection:

Theo blog post, VC10 hỗ trợ tính năng này.

Kiểm tra của tôi cho thấy trình hủy không được gọi trên các đối tượng bị mất, vì vậy tôi không chắc liệu vị trí bộ nhớ của chúng đã được giải phóng hay chúng bị rò rỉ.

Tôi không có ý định tùy thuộc vào nó, bằng mọi cách, nhưng không thể tìm thấy câu trả lời thẳng, dứt khoát về hành vi của nó.

Trả lời

36

Hỗ trợ GC tối thiểu (n2670) chỉ có nghĩa là các chức năng như std::declare_reachable được bao gồm và xác định ý nghĩa của "con trỏ có nguồn gốc an toàn", do đó, thực hiện các hoạt động nhất định như giá trị con trỏ XOR trở thành hành vi chưa xác định và GC don không cần phải lo lắng về nó. Xem thêm Bjarne Stroustrup's C++11 FAQ on the GC ABIn2585: Minimal Support for Garbage Collection and Reachability-Based Leak Detection.

Đề xuất cho phép GC được triển khai trong khuôn khổ C++ 11. Nhưng bản thân đề xuất không có nghĩa là nhu cầu triển khai cần hỗ trợ GC. Một số thư viện, ví dụ: libC++ đơn giản thực hiện các hàm thư viện như no-op.

Tôi khá chắc chắn, vào thời điểm này, bộ nhớ trong trường hợp của bạn chỉ bị rò rỉ. Nhưng lưu ý rằng destructor thực sự không bắt buộc phải chạy khi GC xảy ra. Giả sử "§3.8 Object đời" cũng cung cấp cho con trỏ GC-ed, chúng tôi có (§3.8/4):

... Đối với một đối tượng của một loại lớp học với một destructor không tầm thường, chương trình không bắt buộc phải gọi destructor một cách rõ ràng trước khi lưu trữ mà đối tượng chiếm được tái sử dụng hoặc phát hành; tuy nhiên, nếu không có lệnh gọi rõ ràng cho destructor hoặc nếu một biểu thức xóa (5.3.5) không được sử dụng để giải phóng lưu trữ, thì hàm hủy không được ngầm gọi và bất kỳ chương trình nào phụ thuộc vào các tác dụng phụ do trình hủy có hành vi không xác định.

Vì vậy, cũng có thể bộ nhớ đã được giải phóng mà không có trình hủy được gọi. Trong thực tế, đề xuất GC trước đó như n2310: Transparent Programmer-Directed Garbage Collection for C++ một cách rõ ràng rằng (n2310 §7)

Khi một đối tượng được tái chế bằng cách thu gom rác, destructor của nó không gọi (Tất nhiên, xóa rõ ràng luôn gọi destructor).

+0

Cảm ơn bạn đã trả lời! –

+0

Như tôi đã hiểu, 3.8/4 là một phần nói về "chương trình", không cần gọi hàm hủy. Nói cách khác, chúng ta không cần phải nói 'foo-> ~ MyClass(); xóa foo; '. Trong trường hợp GC nó sẽ là hợp lý để giả định rằng GC chạy giống như sử dụng biểu thức 'delete' - trong trường hợp đó GC chịu trách nhiệm gọi hàm hủy. – Eponymous

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