"这"指针和容器

时间:2014-05-10 17:00:22

标签: c++ entity-framework pointers containers

对于我的游戏,我构建了一个小框架,其中包括:

  • 拥有组件的实体。
  • 指向实体的指针的系统。
  • 拥有系统的引擎。
  • 拥有实体的EntityManager。

每次添加一个Component时,Entity都会通过它所持有的Engine指针将它的“this”指针传递给Systems,并决定是注册还是忽略它。

现在,由于实体是EntityManager容器的元素,我是否正确地假设如果对它进行插入操作会导致移位或重新分配,系统将不再保留有效指针?

如果是这样,什么是可用于防止这种情况发生的好容器?如果我理解正确,这与迭代器的情况类似,当要求插入非失效时,应该应用相同的规则。

2 个答案:

答案 0 :(得分:2)

如果存储实体向量,然后只存储它们的迭代器来访问它们:是的,重新分配可能会使所有数据无效。

建议的方法是存储一个指针向量(如果你需要内存收集功能,你可能想要一个智能指针向量)。这样,无论容器空间的重新分配如何,每次插入/删除时都会确保指针有效(假设没有任何其他东西触及对象)。

如果您只是将对象存储在容器而不是指针中,那么问题就不清楚,而是提出建议:当将元素插入容器时,如

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

您正在存储对象的副本。这通常是不合需要的,因为这会带来额外的复制开销,如果没有正确设置,可能会产生问题。参见&#34;浅拷贝&#34;和#34;深拷贝&#34;了解有关此问题的更多信息。

答案 1 :(得分:0)

只有重新定位实际值时,指针值才会改变。 在这种情况下,您可以操作对象数组而不是指向这些对象的指针数组。你绝对不应该做前者。

我建议使用标准集合,如std :: array或std :: vector来管理对象。有了这些,并且如果你已经在堆上实现了对象(阅读:使用new),你就不必担心它的价值。