Из-за моей репутации noob, я не могу ответить на этот Thread, в частности, принятый ответ:
Я никогда не использовал boost:: intrusive smart pointers, но если бы вы использовали интеллектуальные указатели shared_ptr, вы могли бы использовать объекты weak_ptr для вашего кеша.
Эти указатели weak_ptr не считаются ссылкой, когда система решает освободить их память, но может использоваться для извлечения shared_ptr, пока объект еще не удален.
Это, конечно, интуитивная идея, однако стандарт С++ не поддерживает сравнение weak_ptrs, поэтому он не может использоваться как ключ для ассоциативных контейнеров. Это можно обойти, реализовав оператор сравнения для weak_ptrs:
template<class Ty1, class Ty2>
bool operator<(
const weak_ptr<Ty1>& _Left,
const weak_ptr<Ty2>& _Right
);
Проблема с этим решением состоит в том, что
(1) оператор сравнения должен получить право собственности на каждое сравнение (т.е. создавая shared_ptrs из ссылок weak_ptr)
(2) weak_ptr не удаляется из кеша, когда последний shared_ptr, который управляет ресурсом, уничтожается, но с истекшим значением weak_ptr хранится в кеше.
Для (2) мы могли бы предоставить пользовательский деструктор (DeleteThread), однако для этого потребуется снова создать weak_ptr из T *, который должен удалить, который затем можно использовать для удаления слабой_ptr из кеша.
Мой вопрос будет, если есть лучший подход к кешу с помощью интеллектуальных указателей (я использую компилятор VC100, без повышения), или просто не получаю его?
Приветствия, Даниэль