2016-02-09 6 views
1

У меня есть std::vector от GameObject s. Я обращаюсь к этим GameObject с помощью прямых указателей на них. (Не беспокойтесь о том, что указатели становятся недействительными, я обновляю указатели, когда сам vector). Класс GameObject имеет функцию, называемую load().Вызывает ли вызывающие функции элемент `std :: vector`, который перераспределяется во время вызова функции?

Итак, в одном случае я вызываю load() экземпляра GameObject, который хранится в пределах vector. Эта функция подталкивает другой GameObject в конце vector. Это приводит к тому, что vector исчерпает память и перераспределяет (или изменяет размер). Теперь, после этого звонка на push_back возвращается, load() не может получить доступ к любому из участников экземпляра GameObject. Однако экземпляр все еще существует на одном и том же векторе.

Почему функция не может получить доступ к элементам? Элементы, видимые load, содержат нежелательные/неправильные значения. Любые объяснения?

ответ

2

vector не может сделать магию. Он должен перемещать элементы, используя либо их конструкторы перемещения (если это возможно), либо копировать конструкторы, а затем уничтожать старые объекты в предыдущем местоположении.

Итак, в вашем случае будет вызываться GameObject::~GameObject для объекта, на который вы назвали GameObject::load. Конечно, есть другой логически идентичный объект в другом месте, но ваш указатель this недействителен, когда возвращается load. Нет никакого способа, чтобы vector мог обновить указатель this во время разговора.

+0

hmmm ... это что-то подумать. Мне придется использовать другой контейнер ... Просто спрашивайте, какие-нибудь идеи о том, что делать в этом случае? –

+2

'std :: deque' также имеет O (1) произвольный доступ, но не перераспределяет. – MSalters

+0

все хорошо! Большое спасибо! –