C++ 从std::vector::operator[]获取返回地址的作用是什么?
我正在做一些类似于:C++ 从std::vector::operator[]获取返回地址的作用是什么?,c++,pointers,stl,vector,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]); 结构ABC{ int p,q,r; }; 结构X{ ABC*ABC; X(ABC&ABC):ABC&ABC{} }; std::vec; ... //填充向量 X(vec[2]);
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]);
结构ABC{
int p,q,r;
};
结构X{
ABC*ABC;
X(ABC&ABC):ABC&ABC{}
};
std::vec;
... //填充向量
X(vec[2]);
当我调试时,
x.abc
在赋值之后看起来是正确的,但不久之后,x.abc中的数据就是垃圾。这让我觉得指针指向一个局部变量。。。但是vector::operator[]
返回一个引用,所以这是可能的吗?在内部,std::vector
通常维护它包含的元素的动态数组。如果向量的大小增长过大并超过其旧容量,它将分配一个新数组,复制旧元素,然后取消分配旧数组。因此,任何指向该旧数组的引用或指针都将无效,如果使用,将导致未定义的行为
如果要将指针存储到向量中,应确保向量不会重新分配其内部缓冲区。您可以在获取引用之前等待将要添加到向量的所有元素添加完毕,或者调用vector::reserve
以确保容量足够大
不过,更好的做法是将对向量的引用与索引一起存储,然后每次在该索引处查找元素。这样,如果向量调整其内部缓冲区的大小,指针就不会变成垃圾,因为每次都要对向量进行索引
希望这有帮助 这可能是std::deque
而不是std::vector
@ildjarn的一个很好的用例:指向deque
的指针可能会失效我相信,你是否想过列表
?@Jesse:尽管迭代器会失效,插入std::deque
的指针/引用在前面插入或后面插入deque
时不会失效,因为它不需要像std::vector
必须的那样重新分配现有元素(参见C++11§23.3.3.4/1)。@ildjar:,只要他们不做
insert`.@Jesse:即使是insert也可以,只要在前面或后面。更新了一点,希望更清楚。