为什么我指向 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)
push_back
使指向现有元素的指针、引用和迭代器失效。
这是因为相邻保证。push_back
增加了vector的大小,如果内部缓冲区的容量不足以在现有项之后立即容纳一个新项,为了保持它们的连续性,必须将它们全部移动到一个新的更大的缓冲区。
如果您希望在以后调用push_back
后继续访问元素,您的选择是通过vector中的索引访问它,或者使用没有连续性保证的容器,例如std::list
。
vector的存储空间被重新分配(为了在一个连续的块中容纳更多的元素),所有的指针(和迭代器)都无效。
在这里了解更多信息:http://en.cppreference.com/w/cpp/container/vector/push_back
如果新的
size()
大于capacity()
,则所有迭代器和引用(包括过端迭代器)无效。否则,只有过末端迭代器失效。
相关文章:
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 在类定义之后定义一个私有方法
- 在循环C++中指定字符串之后,不会打印该字符串
- C++宏忽略之后的内容
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- strncpy之后的char数组的错误行为
- 计算十进制 c++ 之后的数字
- "x += x--"之后的 x 是什么?
- 类的前向声明之后的类成员函数定义,在类声明之前
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 推导 std::vector::back() 的返回类型
- execlp() 在 fork() 之后无法正常工作
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 我认为我的代码很好,但它在 cin a 之后停止并且没有进一步?
- 如何在MISRA C++之后实施CRTP
- 在 OpenCV 的 namedWindow 之前或之后初始化 Tesseract
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- C++ 如果在 if 为 true 之后运行,为什么还会这样做
- 在 fork() 之后,我在我的程序中不断得到相同的 pid
- OpenSSL C API:如何在程序exec()之后恢复TLS连接?