У меня есть набор объектов Creature
, созданных и принадлежащих в одной части моего приложения с использованием std::make_shared
и std::shared_ptr
.
Я также отслеживаю выбор нуля или одного Creature
в объекте World
, используя std::weak_ptr<Creature>
.
void World::SetSelection(const std::shared_ptr<Creature>& creature) {
selection = creature;
}
std::shared_ptr<Creature> World::GetSelection() const {
return selection.lock();
}
Вызывающий GetSelection
отвечает за проверку того, является ли указатель пустым. Если это так, это означает, что в настоящее время нет выбора.
Все это прекрасно работает, как мне нравится: когда выбранный Creature
умирает по естественным причинам (в другом месте приложения), GetSelection
снова начинает возвращать nullptr
, как будто ничего не было выбрано.
Однако в этом случае элемент World::selection
по-прежнему указывает на блок управления std::shared_ptr
. Это может быть довольно большим, потому что я использую std::make_shared
для создания своих объектов Creature
(я понимаю, что объект Creature
был правильно уничтожен в нужное время, но память для него все еще выделена). Я рассматриваю возможность изменения GetSelection
на это:
std::shared_ptr<Creature> World::GetSelection() {
const auto ret = selection.lock();
if (!ret)
selection.reset();
return ret;
}
Это освобождает память, как только я замечаю, что она больше не нужна. Досадно, что эта версия GetSelection
не может быть const
.
Мои вопросы:
Какая версия
GetSelection
будет лучшей практикой в этой ситуации?Изменится ли ответ, если что-то подобное произойдет в шаблонном коде, где
sizeof(T)
неизвестно и может быть огромным? Или в С++ 14, где может быть задействованstd::make_shared<T[]>
?Если вторая версия всегда лучше, то почему
std::weak_ptr<T>::expired
иlock
не делают этого сами?
weak_ptr
участникаmutable
во втором случае, если хотите, чтобыGetSelection
осталсяconst
. - person T.C.   schedule 13.08.2014selection.lock()
вернул пустойstd::shared_ptr
, ранее управляемый объект каким-то образом не освобождается? - person Snps   schedule 13.08.2014weak_ptr
, я просто пытаюсь немного оптимизировать, что, возможно, можно было бы сделать внутриweak_ptr
. Это напрямую связано с моим третьим вопросом (на который, я думаю, я знаю ответ, но я надеюсь на более информированные мнения, чем мое). - person slajoie   schedule 13.08.2014make_shared
. См. раздел примечаний на [en.cppreference.com/w/cpp/memory. /shared_ptr/make_shared]. - person slajoie   schedule 13.08.2014