重新分配嵌套的c ++向量

时间:2014-11-10 22:31:51

标签: c++ c++11 memory-management vector

我们假设我们有一个包含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>()) {}
};

2 个答案:

答案 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的大多数实现。但这不是你可以依赖的一点。

也许迭代器有引用原始容器的附加调试信息 - 你遇到了麻烦。