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