如何将指针存储到向量中的静态分配对象

How to store pointers to statically allocated objects in a vector?

本文关键字:静态 分配 对象 向量 指针 存储      更新时间:2023-10-16

我想对这些对象做一个对象和另一个指针向量的向量(我不能使用动态内存)。我这样做的方式是以下示例。

#include <iostream>
#include <vector>
using namespace std;
class Foo {
public:
  int bar;
  Foo(int x) : bar(x) {
  }
};
int main () {
  vector<Foo> foos;
  vector<Foo*> pFoos;
  for (int i = 0; i < 10; i++) {
    Foo foo(i);
    foos.push_back(foo);
    pFoos.push_back(&foos.back());
  }
  for (int i = 0; i < 10; i++) {
    cout << foos[i].bar << endl;
    cout << pFoos[i]->bar << endl;
  }
}

我认为这应该起作用,因为foos存储了对象的副本,然后我存储了对副本的引用(因为原始的foo将不确定,因此我不应该存储对此的引用)。但这就是我得到的:

0
36741184
1
0
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9

pFoos的第一个数字是错误的。此外,大量每次都会改变。我看不到任何会导致这种不确定行为的东西。有人可以告诉我我做错了什么?

将项目添加到向量的所有以前的迭代器无效。在向量上调用push_back,如果矢量需要重新分配其内部存储,则可能会使您先前从中获得的指针无效。

如果您知道您永远不会再增加矢量,那么这将起作用:

for (int i = 0; i < 10; i++) {
  foos.push_back(Foo(i));
}
for (int i = 0; i < 10; i++) {
  pFoos.push_back(&foos[i]);
}

或Rodrigo评论:

foos.reserve(10)
for (int i = 0; i < 10; i++) {
  Foo foo(i);
  foos.push_back(foo);
  pFoos.push_back(&foos.back());
}
for (int i = 0; i < 10; i++) {
  cout << foos[i].bar << endl;
  cout << pFoos[i]->bar << endl;
}

我想这不是一个好的编程方法。向量负责存储对象,并且可以进行更大的内存斑点来实现内存...因此,您的指针不再有效...

vector::push_back可以移动元素,这就是地址无效的原因。您可以通过调用reserve在开始将内容推入矢量之前,将矢量的内存预加载到其最终大小,或者您可以等到完成地址之前将其推完直到完成。

,但是您说您"无法使用动态内存"。vector使用动态内存。