为什么指向向量中变量的指针仍然有效?
Why do pointers to variables in a vector stay valid?
以以下代码为例:
int a = 1;
int b = 2;
int c = 3;
std::vector<int> myVector;
myVector.push_back(a);
myVector.push_back(b);
myVector.push_back(c);
int * b_pointer;
b_pointer = &myVector[1]
根据我的经验,即使向量可能重新分配,b_pointer
将始终指向b
,这应该使b_pointer
指向垃圾数据。有没有一种情况下,这是行不通的?
实际上是在询问迭代器是否有效(尽管vector迭代器的类型不一定与简单指针相同)
std::vector<>::insert
的文档说
如果发生了重新分配,所有的迭代器、指针和引用与容器相关的都无效。否则,只有那些在所有迭代器中,指向position及以后的位置无效,指针和引用的元素之前的位置保证保持指向调用前所指向的相同元素
您可能注意到的是,当realloc发生时,如果有可用空间,它有时只是扩展当前的分配。
在重新分配myVector
的内部缓冲区后,b_pointer
将指向无效内存,简单明了。对其解引用将导致未定义行为。
然而,它所指向的内存很有可能仍然包含它以前保存的数据;为什么有些人要为丢弃它付出代价呢?反正法律上也没人能拿到。如果在此期间发生了足够的分配,它最终会被其他东西覆盖。
相关文章:
- 调整大小后指向元素值的指针unordered_map有效?
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 通过指针调用模板类成员函数 [为什么这是有效的 c++]?
- free():在有效指针异常中-使用流读取巨大文件时
- 释放 std::vector 中指针内存的最有效方法是什么?
- C++ 常量指向文字的指针有效吗?
- 是否存在将长整型转换为指针有效的情况
- 将指针传递给函数在简单的情况下有效,但在"class" -izing 之后不起作用
- 在映射中插入更多元素后,指向 QMap 中元素的指针是否仍然有效?
- 指向派生类的指针中的"static_cast<Base*>(static_cast<void*>(派生))"何时有效?
- 如何有效地使用 std::async 对指针数组执行操作
- 当程序从该函数调谐器时,指向在函数中声明和定义的某些 C 字符串的指针不再有效.为什么?
- EIGEN地图类:将C阵列映射到VectorXD指针以有效的方式
- 如何检查指针后面的对象是否有效或已删除?
- C++数组超出范围访问以计算指针有效?
- 提升::进程间managed_shared_memory指针有效作用域
- 为什么const_cast away volatile只对指针有效?
- 为什么将const类型的智能指针强制转换为类型的智能指针有效?