Правильно ли я понял точку зрения Скотта Мейерса на std :: weak_ptr?

Эффективный Современный C ++ (стр. 136) использует следующий пример для мотивации std::weak_ptr, Кэш определяется как неупорядоченная карта со слабыми указателями на объекты в качестве значений. Всякий раз, когда клиенты этого кэша запрашивают объект (по ключу), ищется соответствующий слабый указатель и lock() вызывается на это. Если в результате std::shared_ptr не является null, возвращается. В противном случае объект перезагружается из внешней базы данных, заносится в кеш и std::shared_ptr к нему возвращается.

Теперь вопрос: можно подумать, что было бы возможно реализовать это без std::weak_ptr, но вместо этого хранить сильные общие указатели в качестве значений кэша. Если use_count() сильного указателя равен единице, это означает, что все указатели клиента были уничтожены. Весь смысл этого примера в том, что с помощью std::weak_ptr позволяет нам экономить память, фактически удаляя объекты?

4

Решение

«Неужели весь смысл этого примера в том, что использование std :: weak_ptr позволяет нам экономить память, фактически удаляя объекты?»

Да. В противном случае кэш будет хранить ресурсы, на которые указывают, неограниченное количество времени. Пространство, требуемое для блока управления, если выделено отдельно, как правило, намного меньше, чем тип ресурса, который может потребовать кэширования (например, текстуры, данные сетки, даже локализованные строки).

Хотя можно реализовать ту же функциональность, используя атомарность и проверяя счетчик ссылок, равный 1, для этого потребуется реализация пользовательского дескриптора. std::weak_ptr а также std::shared_ptr сделать все это гораздо менее тяжелым испытанием для прототипа.

5

Другие решения


По вопросам рекламы [email protected]