Bởi vì danh tiếng Noob của tôi, tôi không thể trả lời Thread này, cụ thể là câu trả lời được chấp nhận:Làm thế nào để loại bỏ (non-intrusive) con trỏ thông minh từ một bộ nhớ cache khi không có tài liệu tham khảo nhiều hơn?
tôi không bao giờ sử dụng tăng :: gợi ý thông minh xâm nhập, nhưng nếu bạn sẽ sử dụng con trỏ shared_ptr thông minh, bạn có thể sử dụng weak_ptr đối tượng cho bộ nhớ cache của bạn.
Những con trỏ weak_ptr này không được tính là tham chiếu khi hệ thống quyết định giải phóng bộ nhớ của chúng, nhưng có thể được sử dụng để truy xuất shared_ptr miễn là đối tượng chưa bị xóa.
Đây chắc chắn là một ý tưởng trực quan, tuy nhiên, tiêu chuẩn C++ không hỗ trợ so sánh weak_ptrs, vì vậy nó không thể được sử dụng làm khóa cho vùng chứa liên kết. Điều này có thể được phá vỡ bằng cách thực hiện một toán tử so sánh cho weak_ptrs:
template<class Ty1, class Ty2>
bool operator<(
const weak_ptr<Ty1>& _Left,
const weak_ptr<Ty2>& _Right
);
Vấn đề với giải pháp này là
(1) các toán tử so sánh có để có được quyền sở hữu cho mỗi so sánh (tức là tạo shared_ptrs từ weak_ptr ref)
(2) weak_ptr không bị xóa khỏi bộ nhớ cache khi shared_ptr cuối cùng quản lý tài nguyên bị hủy, nhưng tệp weak_ptr hết hạn được lưu trong bộ nhớ cache.
Đối với (2), chúng tôi có thể cung cấp một tùy chỉnh destructor (DeleteThread), tuy nhiên, điều này sẽ yêu cầu một lần nữa để tạo ra một weak_ptr từ T * đó là xóa, mà sau đó có thể được sử dụng để xóa weak_ptr từ bộ nhớ cache .
Câu hỏi của tôi sẽ là nếu có cách tiếp cận nào tốt hơn với bộ nhớ cache bằng con trỏ thông minh (tôi đang sử dụng trình biên dịch VC100, không tăng) hoặc tôi không nhận được nó?
Chúc mừng, Daniel
bạn không thể thay đổi khóa của bất kỳ container dựa trên khóa nào !!! Nó phải là bất biến! Bạn có thể có một số tùy chỉnh xóa-the-last mà đạt ra và loại bỏ các mục từ container của bạn. Nhưng có một giá trị thay đổi quan trọng trong khi trong một container là rất lớn không-không. – Mordachai
Đó là chính xác vấn đề, tôi sẽ cần phải cung cấp một deleter tùy chỉnh mà xóa các đối tượng từ bộ nhớ cache để tránh có một con trỏ hết hạn trong bộ nhớ cache. Hay bạn đang nói chung hơn, vì số lượng ref thay đổi? – dwn