удаление общих указателей из вектора или карты

В настоящее время я нахожусь в процессе изучения умных указателей и стараюсь избегать использования сырых указателей.

У меня есть вектор с общими ptrs

std::vector<std::shared_ptr<View>> mChildren;

и метод добавления и удаления

void View::AddChild(std::shared_ptr<View> view) {
mChildren.push_back(view);
}

void View::RemoveChild(std::shared_ptr<View> view) {
auto removal = std::remove(mChildren.begin(), mChildren.end(), view);
mChildren.erase(removal, mChildren.end());
}

Теперь в другой части моего кода у меня есть карта

std::map<std::weak_ptr<ModelGem>,std::unique_ptr<ViewGem>,std::owner_less<std::weak_ptr<ModelGem>>> mViews;

Теперь, когда я пытаюсь удалить элементы с карты следующим образом:

for (auto iterator = mViews.begin(); iterator != mViews.end();)
{
if (iterator->first.expired())
{
RemoveChild(iterator->second.get());
iterator = mViews.erase(iterator);
}
else
{
iterator++;
}
}

Теперь проблема заключается здесь: iterator->second.get()
Он говорит мне, что не может преобразовать значение типа указателя в общий ptr.
Однако, если я использую сырые указатели вместо общих указателей, это вообще не проблема.

Итак, мне интересно, если в этом случае было бы лучше просто использовать сырые указатели или я могу обойти это с общими указателями?

1

Решение

Итак, мне интересно, если в этом случае было бы лучше просто использовать сырые указатели или я могу обойти это с общими указателями?

В большинстве случаев есть только один правильный тип указателя для использования. Это не так, как один лучше, чем другой. Есть только один правильный путь.

Карта содержит unique_ptr<ViewGem>, Это означает, что он берет на себя полную ответственность и не разделяется с какой-либо другой структурой данных. Таким образом, невозможно иметь один и тот же объект в vector<shared_ptr...> не вызывая неопределенного поведения. Вы должны решить, у кого ds есть владелец корабля,

  1. Если карта полностью принадлежит, используйте unique_ptr в карте и сырой ptr в векторе
  2. Если вектор имеет право собственности, используйте unique_ptr в векторе и сырой ptr на карте.
  3. Если владение похоже на владение ds и объект должен быть уничтожен только тогда, когда он удален как с карты, так и с вектора, то используйте shared_ptr в обоих.
1

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

Других решений пока нет …

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