Скажите, у меня есть объект:
struct Foo
{
int bar_;
Foo(int bar) bar_(bar) {}
};
, и у меня есть контейнер STL, который содержит Foo
s, возможно, вектор, и я беру
// Elsewhere...
vector<Foo> vec;
vec.push_back(Foo(4));
int *p = &(vec[0].bar_)
Это ужасная идея, верно?
Причина в том, что vector
будет хранить свои элементы в динамически размещаемом массиве где-то, и, в конце концов, если вы добавите достаточно элементов, ему придется выделить другой массив, скопировать все элементы исходного массива. и удалите старый массив. После этого p
указывает на мусор. Вот почему многие операции на vector
делают недействительными итераторы.
Кажется, что было бы разумно предположить, что операция, которая делает недействительными итераторы из контейнера, также делает недействительными указатели на элементы данных элементов контейнера, и что если операция не делает недействительными итераторы, эти указатели все еще будут в безопасности. Однако многие разумные предположения являются ложными. Это один из них?