我们假设我们有一个包含std::vector
容器的结构:
struct A {
char a; // decoration
vector<int> v;
A() {}
};
在我们的代码中的某个时刻,我们有一个std::vector
存储那些A
结构(这意味着两个级别的std::vector
s),之后,我们保留了更多的内存空间其中一个元素的v
:
/*...*/
vector<A> vect;
vect.resize(10, A());
vector<A>* vect_ptr = &vect;
vect[0].v.reserve(9999999);
cout << vect_ptr << " ?= " << &vect << endl;
/*...*/
问题是:在为一个“低级”向量v
保留空间之后,是否存在重新分配'高级'向量vect
的风险,使指针成为指针vect_ptr
无效?
在肯定的情况下,是否会重新定义v
作为参考解决方案? (即使它增加了间接级别):
struct A {
char a;
vector<int>& v;
A() : v(vector<int>()) {}
};
答案 0 :(得分:2)
没有。没有这样的风险。
vect
拥有一些内存,它写了一堆A
s:所以也许在内存中这样的东西:
[--A--][--A--][--A--]...[--A--]
^ ^
&vect[0] &vect[9]
但是那些A
中的每一个都有一些向量指向其他地方的更多内存。以下是vect[1].v
可能指出的简要说明:
[int][int][int][int][int]...
^
|
[--A--][--A--][--A--]...[--A--]
^ ^
&vect[0] &vect[9]
(我为可怕的ascii艺术道歉)
这两个容器拥有自己的内存,不会重叠。调整其中一个“内部”向量可能会改变它拥有的内存,但它与内存vect
拥有的内容无关(除非您的分配器严重损坏,std::allocator
不是)。您可以将vect
的内存视为完全禁止其他任何内容尝试分配的内存。你试图在一个“内部”向量中分配多少并不重要。在某些时候,您将无法分配那么多内存,但永远不会有任何重新分配任何其他对象的风险。
答案 1 :(得分:0)
也许。我不认为标准实际上保证了这一点。它是实现定义的,应该适用于std :: vector的大多数实现。但这不是你可以依赖的一点。
也许迭代器有引用原始容器的附加调试信息 - 你遇到了麻烦。