2013-11-15 16 views
5

Tôi đang làm việc trên một dự án học tập của tôi (trong C) và nghĩ đến việc chuyển nó sang C++ để có thêm điểm học tập. Một phần của nó liên quan đến một hệ thống thu gom rác cho một gia đình cụ thể của các đối tượng, trong C, tôi thường thực hiện với một malloc/mmap lớn và đi với một đánh dấu ngây thơ đơn giản (tôi có thể xác định tài liệu tham khảo và những thứ tương tự đã).Bộ sưu tập đồ chơi rác: Nhà điều hành mới/xóa đủ?

Vấn đề của tôi là tôi đang xem xét việc chuyển ý tưởng đó tới C++ nhưng không cảm thấy an toàn đủ về sự hiểu biết của tôi về lược đồ quản lý bộ nhớ của nó.

Cho đến nay tôi đã xem xét phân bổ một bộ nhớ lớn và các toán tử nạp chồng mới và xóa trên một lớp cơ sở để gọi các chức năng lấy/giải phóng của vùng bộ nhớ của tôi, và sau đó để cho giai đoạn quét của bộ gom rác xóa các đối tượng. . Như thế đủ chưa? Những cạm bẫy tiềm ẩn mà tôi không thấy ở đây là gì?

Chỉnh sửa: để làm rõ, tôi có thể tìm ra tuổi thọ của các đối tượng được phân bổ đã có, vì vậy không cần phải sử dụng gc abi. Các đối tượng sẽ hiếm khi được điều khiển bằng mã C++ và mã sử dụng chúng có thể thông báo cho gc chúng đang được sử dụng mà không cần kiểm tra ngăn xếp.

+0

Bạn có thể muốn đọc nhận xét của Bjarne Stroustrup về điều này như là một điểm khởi đầu: http://www.stroustrup.com/C++11FAQ.html#gc-abi Nó cũng có liên kết đến các trang của Hans Boehm, vì vậy tôi nghĩ nó là một điểm khởi đầu tuyệt vời. –

Trả lời

1

Nếu bạn đang thay đổi các lớp học tại sao không có chúng kế thừa từ một lớp cơ sở mới đăng ký vào GC trong quá trình xây dựng và hủy đăng ký trong quá trình hủy. Lớp người quản lý sẽ làm việc lưu giữ sách. Lớp cơ sở có thể là một mẫu:

template <class parent> class BASE_GC { 
    BASE_GC() { /* register address and name*/} 
    ~BASE_GC() { /* unregister*/} 
}; 

Tên lớp cha có thể được lấy từ typeid (* this) .name(). Vì tên lớp cơ sở bao gồm tên cha.

+0

Điều này có thể làm tất cả những gì tôi cần. Nếu thay vì chỉ đơn giản là làm sổ kế toán GC, tôi quyết định sử dụng một trình phân bổ khác để chơi với các chiến lược phân bổ khác nhau, sẽ có bất kỳ xung đột nào với việc chỉ ghi đè toán tử mới và xóa không? Sau đó, nếu tôi kết thúc ghi đè lên toán tử mới và xóa nó thậm chí làm cho tinh thần để giữ sổ sách kế toán GC trên constructor/destructor thay vì các toán tử bộ nhớ? –