我使用一个简单的代码:
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)。
答案 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()
,则所有迭代器和引用(包括过去的迭代器)都将失效。否则只有过去的迭代器无效。