【发布时间】:2020-10-14 21:54:03
【问题描述】:
我在运行时使用 vector.push_back() 创建对象,并且我想存储播放器对象,以便我可以随时使用它。所以我将刚刚创建的播放器的指针存储到一个全局指针变量中,但是当我推回下一个对象时,播放器的内存地址会发生变化,我认为是因为向量必须调整大小,因此会更改其所有元素的位置。
for (int y = 0; y < 5; y++)
{
for (int x = 0; x < 10; x++)
{
switch (map[x + 10 * y])
{
case '1':
gameObjects.push_back(player);
playerPointer = &gameObjects.back();
break;
case '2':
gameObjects.push_back(block);
gameObjects.back().transform.pos = vec((float)x * 100, (float)y * 150, 0);
break;
}
}
}
但是当我使用时
gameObjects.reserve(10000);
位置不会改变,因为它是保留的,在这种情况下直到大小变为 10000 才需要调整大小。
那么问题是什么?你可以只保留(1000000000)而没有任何后果吗?我的 RAM 使用量并没有飙升。
提前致谢
【问题讨论】:
-
当然,您可以保留任意多的空间。如果它未能分配内存,它将引发异常。但是,这似乎是解决您的问题的一种非常糟糕的方法。您可以存储对向量的引用以及索引,而不是存储指向向量中对象的原始指针。或者如果你很懒,你可以换成
std::deque。它永远不会重新分配它的元素。 -
指数可以稳定。有时
std::list是一种替代方案(它具有更稳定的迭代器),但请考虑缺点 -
"当我推回下一个对象时,播放器的内存地址会改变"我认为你有一个 XY 问题。真正的问题是,如果这个地址发生变化,为什么重要?是因为您试图将指向该对象的直接指针存储在其他地方吗?那么也许你应该做其他事情——例如,只存储一个数字索引,用于索引向量;或使用某种智能指针类型;或存储索引与指向向量的指针的组合。或者反过来:将智能指针存储在向量中,并将一个指向硬编码的
player。 -
@KarlKnechtel 我同意一些扩展,但显然不是 X
playerPointer = &gameObjects.back();吗?虽然,是的,这个例子可能更清楚,因为实际问题不在这段代码中,而是在其他一些使用playerPointer且假设错误的代码中 -
我有时很难阅读和理解问题中的所有信息 :)