Как удалить (ненавязчивые) интеллектуальные указатели из кеша, когда больше нет ссылок?

Из-за моей репутации новичка я не могу ответить на эту тему , в частности принятый ответ:

Я никогда не использовали интеллектуальные указатели 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, без ускорения), или я просто не понимаю его?

Ура, Дэниел

14
задан Community 23 May 2017 в 12:01
поделиться