每次都获得不同的地址

时间:2014-06-21 22:32:28

标签: c++ c++11 g++ stdvector memory-address

在下面的代码中,每次std::vector v的第一个元素都会得到一个不同的地址。为什么会这样?

#include <memory>
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v;

    for (int i=0; i<10; ++i)
    {
        int b = i;

        v.push_back(b);

        std::cout << std::addressof(v[0]) << std::endl;
    }

    return 0;
}

输出:

0x603010
0x603030
0x603010
0x603010
0x603050
0x603050
0x603050
0x603050
0x603080
0x603080

2 个答案:

答案 0 :(得分:8)

因为在调用

时可能必须为向量中包含的数据分配新内存
 v.push_back(b);

<强> P.S。

你说:

  

在下面的代码中,每次为std :: vector v的第一个元素得到一个不同的地址。为什么会这样?

如果你看看你的输出,那么每次都不是这样:)

答案 1 :(得分:0)

是的,您不希望获取/使用/保存向量元素的地址(通常除非您不在指针访问和使用之间插入/擦除,但理想情况下从不,只使用索引!) 。虽然向量将保持连续的保证,但是可以自由地在较大的连续存储器块处重新分配元件以适应不断增加的容量要求。显然,这不是一个链表的情况,它不需要连续的内存。顺便说一下,矢量迭代器面对的是“插入/删除时无效”的关注点作为元素的指针。