удаление общих указателей из вектора или карты - PullRequest
0 голосов
/ 21 октября 2018

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

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

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

и метод Add and Remove

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 Ответ

0 голосов
/ 21 октября 2018

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

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

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

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