如何将指针存储到向量中的静态分配对象
How to store pointers to statically allocated objects in a vector?
我想对这些对象做一个对象和另一个指针向量的向量(我不能使用动态内存)。我这样做的方式是以下示例。
#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
使用动态内存。
相关文章:
- 将 RTOS 队列对象封装在仅具有静态分配的 IQueue 自定义接口中
- 静态分配对象的值初始化
- 对静态分配的子类对象进行静态分配的纯虚拟父类引用是否合法?
- 动态分配对象中的字段-动态分配更好还是静态分配更好?C++
- 静态分配和动态分配返回不同的答案
- 创建自己的owner_ptr类;在传递堆栈或静态分配的地址时如何避免UB?
- 如何捕获源自静态分配对象的构造函数的异常?
- 是静态分配的数组的内存分配始终是地址值的顺序
- C++如何使用虚拟基类型声明全局静态分配的变量
- 用静态分配替换动态分配
- 为静态分配的变量手动调用析构函数
- 如何将指针存储到向量中的静态分配对象
- 静态分配的可变大小数组如何在C++中工作
- 是否可以指定一个变量作为静态分配的整数数组的大小说明符
- 为什么禁止c++中的静态分配
- 更适合动态或静态分配复杂的数据成员
- 静态分配提升图
- 使用 new 运算符静态分配对象
- 静态分配内存释放
- 重新调用静态分配对象的构造函数