Для моей игры я построил небольшой фреймворк, который помимо прочего имеет:
Каждый раз, когда я добавляю Компонент, сущность передает свой указатель «this» Системам через указатель Engine, который он содержит, и они решают, зарегистрировать его или проигнорировать.
Теперь, поскольку сущности являются элементами контейнера EntityManager, прав ли я, предполагая, что если операция вставки в него вызывает сдвиги или перераспределение, системы больше не будут содержать действительные указатели?
Если так, то какой хороший контейнер можно использовать для предотвращения этого? Если я правильно понимаю вещи, это похоже на то, что происходит с итераторами, и те же правила должны применяться, когда требуется недействительность с вставкой.
Если вы сохраняете вектор сущностей, а затем просто сохраняете их итераторы для доступа к ним: да, перераспределение может сделать недействительными все ваши данные.
Предлагаемый способ — сохранить вектор указателей (если вам нужны возможности сбора памяти, вы можете использовать вектор умных указателей). Таким образом, вы будете уверены, что указатели действительны (при условии, что больше ничего не коснулось объектов) при каждой вставке / удалении независимо от перераспределения пространства контейнера.
Из вопроса не ясно, но совет, если вы просто храните объекты в своих контейнерах вместо указателей: при вставке элементов в контейнер, как с
std::vector<T>::push_back()
вы храните копию объекта. Это обычно нежелательно, поскольку приводит к дополнительным затратам на копирование и может создать проблемы, если что-то не настроено должным образом. См. «Мелкие копии» и «глубокие копии», чтобы узнать больше об этой проблеме.
Ваше значение указателя изменится только в том случае, если произойдет перемещение фактического значения.
Это тот случай, когда вы манипулируете массивами объектов вместо массивов указателей на эти объекты. Вы определенно не должны делать первое.
Я бы предложил использовать стандартные коллекции, такие как std :: array или std :: vector, для управления объектами. С ними и при условии, что вы создали экземпляры объектов в куче (читай: с новым), вам не придется беспокоиться о значении этого.