Mr.*_*Boy 2 c++ pointers stl vector
我做的事情如下:
struct ABC{
int p,q,r;
};
struct X{
ABC *abc;
X(ABC &abc) : abc(&abc) {}
};
std::vector<ABC> vec;
... //populate vec
X x(vec[2]);
Run Code Online (Sandbox Code Playgroud)
当我调试时,x.abc在赋值后直接看起来正确,但之后不久x.abc中的数据就是垃圾.它让我觉得指针是一个局部变量......但是vector::operator[]返回一个引用,那么可能吗?
在内部,它std::vector通常维护它包含的元素的动态数组.如果向量的大小变得太大并超过其旧容量,它会分配一个新数组,复制旧元素,然后释放旧数组.因此,对旧数组的任何引用或指针都将变为无效,如果使用,将导致未定义的行为.
如果要将指针存储到向量中,则应确保向量不会最终重新分配其内部缓冲区.您可以通过等待直到您在引用之前添加要添加到向量的所有元素,或者通过调用vector::reserve以确保容量足够大来执行此操作.
但更好的方法是将vector对象本身的引用与索引一起存储,然后每次在该索引处查找元素.这样,如果向量调整其内部缓冲区的大小,则指针不会变为垃圾,因为每次都会重新索引到向量中.
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
216 次 |
| 最近记录: |