& Quot; это & ​​quot; указатель и контейнеры

Для моей игры я построил небольшой фреймворк, который помимо прочего имеет:

  • Сущности, которые владеют компонентами.
  • Системы, которые содержат указатели на объекты.
  • Двигатель, который владеет системами.
  • EntityManager, который владеет сущностями.

Каждый раз, когда я добавляю Компонент, сущность передает свой указатель «this» Системам через указатель Engine, который он содержит, и они решают, зарегистрировать его или проигнорировать.

Теперь, поскольку сущности являются элементами контейнера EntityManager, прав ли я, предполагая, что если операция вставки в него вызывает сдвиги или перераспределение, системы больше не будут содержать действительные указатели?

Если так, то какой хороший контейнер можно использовать для предотвращения этого? Если я правильно понимаю вещи, это похоже на то, что происходит с итераторами, и те же правила должны применяться, когда требуется недействительность с вставкой.

0

Решение

Если вы сохраняете вектор сущностей, а затем просто сохраняете их итераторы для доступа к ним: да, перераспределение может сделать недействительными все ваши данные.

Предлагаемый способ — сохранить вектор указателей (если вам нужны возможности сбора памяти, вы можете использовать вектор умных указателей). Таким образом, вы будете уверены, что указатели действительны (при условии, что больше ничего не коснулось объектов) при каждой вставке / удалении независимо от перераспределения пространства контейнера.

Из вопроса не ясно, но совет, если вы просто храните объекты в своих контейнерах вместо указателей: при вставке элементов в контейнер, как с

std::vector<T>::push_back()

вы храните копию объекта. Это обычно нежелательно, поскольку приводит к дополнительным затратам на копирование и может создать проблемы, если что-то не настроено должным образом. См. «Мелкие копии» и «глубокие копии», чтобы узнать больше об этой проблеме.

2

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

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

Я бы предложил использовать стандартные коллекции, такие как std :: array или std :: vector, для управления объектами. С ними и при условии, что вы создали экземпляры объектов в куче (читай: с новым), вам не придется беспокоиться о значении этого.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector