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

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

本文关键字:之后 back push std vector 元素 指针 为什么      更新时间:2023-10-16

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

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)

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

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

如果您希望在以后调用push_back后继续访问元素,您的选择是通过vector中的索引访问它,或者使用没有连续性保证的容器,例如std::list

vector的存储空间被重新分配(为了在一个连续的块中容纳更多的元素),所有的指针(和迭代器)都无效。

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

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