为什么我的指向std :: vector元素的指针在push_back()之后改变了它的值?

时间:2016-09-07 03:04:13

标签: c++ vector stdvector

我使用一个简单的代码:

std::vector < float > arr = { 3.42f, 6.45f, 53.43f };
float *elemPtr;
elemPtr = &arr[ 0 ];

std::cout << "elemPtr = " << *elemPtr << std::endl;
arr.push_back( 7.0f );
std::cout << "elemPtr = " << *elemPtr << std::endl;

该代码产生以下输出:

elemPtr = 3.42
elemPtr = -6.25982e+18

为什么在push_back之后会发生这种情况?我没有删除向量的第一个元素。它为什么会这样?

我使用Clang编译器(Xcode)。

2 个答案:

答案 0 :(得分:9)

lea rdx, [rip + symbol]使现有元素的指针,引用和迭代器无效。

这是因为邻接保证。 push_back增加了向量的大小,如果内部缓冲区的容量不足以在现有缓冲区之后立即保存新项目,为了保持连续性,它们都必须移动到新的更大的缓冲区。

如果您希望在将来调用push_back后继续访问元素,您的选项是通过向量中的索引访问它,或使用没有连续性保证的容器,例如push_back

答案 1 :(得分:4)

向量的存储被重新分配(以容纳一个连续块中的更多元素),使所有指针(和迭代器)无效。

点击此处了解详情:http://en.cppreference.com/w/cpp/container/vector/push_back

  

如果新size()大于capacity(),则所有迭代器和引用(包括过去的迭代器)都将失效。否则只有过去的迭代器无效。