对于我的游戏,我构建了一个小型框架,其中包括:
- 拥有组件的实体。
- 保存指向实体的指针的系统。
- 拥有系统的引擎。
- 拥有实体的 EntityManager。
每次我添加一个组件时,实体都会通过它持有的引擎指针将它的“this”指针传递给系统,然后它们决定是注册还是忽略它。
现在,由于实体是 EntityManager 容器的元素,我是否正确地假设如果对它的插入操作导致移位或重新分配,系统将不再持有有效指针?
如果是这样,什么是可以用来防止这种情况发生的好容器?如果我理解正确的话,这类似于迭代器发生的情况,并且在要求插入非无效时应该应用相同的规则。
最佳答案
如果您存储一个实体 vector ,然后只存储它们的迭代器以访问它们:是的,重新分配可能会使您的所有数据无效。
建议的方法是存储指针 vector (如果您需要内存收集功能,您可能希望使用智能指针 vector )。这样,无论容器空间的重新分配如何,您都可以确保每次插入/删除时指针都是有效的(假设没有其他东西触及对象)。
如果您只是将对象而不是指针存储在容器中,则问题尚不清楚,但建议:将元素插入容器时,如 with
std::vector<T>::push_back()
您正在存储对象的拷贝。这通常是不可取的,因为会带来额外的复制开销,并且如果设置不当可能会产生问题。请参阅“浅拷贝”和“深拷贝”以了解有关此问题的更多信息。
关于c++ - "this"指针和容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23583933/