Предположим, у меня есть следующий код:Изменение векторной ссылки. Что становится недействительным?
void appendRandomNumbers(vector<double> &result) {
for (int i = 0; i < 10000; i++) {
result.push_back(rand());
}
}
vector<double> randomlist;
appendRandomNumbers(randomlist);
for (double i : randomlist) cout << i << endl;
Неоднократное push_back() операций, в конечном счете привести к перераспределению, и я подозреваю, что повреждение памяти. Действительно, vector.push_back() documentation говорит, что
Если перераспределение происходит, все итераторы, указатели и ссылки, связанные с контейнером аннулируются.
После того, как произойдет перераспределение, какой из областей будет иметь правильный вектор? Будет ли ссылка, используемая appendRandomNumbers, недействительной, поэтому она подталкивает числа к местам, которых она не должна, или будет известна «правильная» локация только с помощью appendRandomNumbers, и вектор удаляется, как только он выходит из области видимости?
Будет ли цикл печати переходить по фактическому вектору или по заштрихованной области памяти, где раньше находился вектор?
Редактировать: Большинство ответов прямо сейчас говорят, что векторная ссылка сама по себе должна быть прекрасной. У меня есть код, похожий на тот, который был выше, что вызвало повреждение памяти, когда я изменил вектор, полученный по ссылке, и прекратил иметь повреждение памяти, когда я изменил подход. Тем не менее, я не могу исключить, что я случайно установил истинную причину во время изменения. Будем экспериментировать с этим.
итераторы/указатели и ссылки, указывающие на данные * в * контейнер недействительны. Сам контейнер не перемещается. Если ссылка на контейнер сама по себе недействительна, это было бы почти бесполезно. – Borgleader
Что касается вашего ** Редактировать **: этот фрагмент кода неверен, или вы неверно истолковали результат. Ответы правильные. – MicroVirus