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

Why did my pointer to a std::vector's element change its value after push_back()?

我使用了一个简单的代码:

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)。

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

在此处了解更多信息:http://en.cppreference.com/w/cpp/container/vector/push_back

If the new size() is greater than capacity() then all iterators and references (including the past-the-end iterator) are invalidated. Otherwise only the past-the-end iterator is invalidated.

push_back 使指向现有元素的指针、引用和迭代器无效。

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

如果您想在以后调用 push_back 后继续访问某个元素,您的选择是通过向量中的索引访问它,或者使用不保证连续性的容器,例如 std::list.