Удаление weak_ptr из функции удаления shared_ptr

Безопасно ли и можно ли удалять weak_ptr из функции удаления shared_ptr. Допустим для такой реализации кэша:

class Foo;

using FooShared = std::shared_ptr<Foo>;
using FooWeak = std::weak_ptr<Foo>;
using FooKey = std::string;

std::map<FooKey, FooWeak> fooCache{};

FooShared createFoo(FooKey key, ...)
{
    const auto it = fooCache.lower_bound(key);
    if(fooCache.end() == it || it->first != key)
    {
        const auto instance = new Foo(...);
        const auto cleanup = [&fooCache, key](Foo * instance)
        {
             fooCache.erase(key);
             delete instance;
        };
        const auto shared = FooShared(instance, cleanup);
        fooCache.emplace_hint(it, key, shared); 
        return shared;
    }
    return it->second.lock();
}

Ответы (1 шт):

Автор решения: Sergei Ozerov

Деструктор std::shared_ptr вызывается после того как счетчик количества ссылок дошел до нуля. Все weak_ptr привязанные к этому же объекту будут в момент вызова деструктора expired и никаких проблем с их удалением не возникнет.

Отмечу однако что приведенная конструкция кэша будет корректно работать только при работе с ней из одного потока.

→ Ссылка