Код, который вы разместили, по-прежнему не будет компилироваться (не объявлено tmp
в первом цикле), поэтому позвольте мне в общих чертах объяснить, что происходит.
Вы упомянули два вида ошибок:
vec.at(i).setVec(tmp); //Works sometimes or causes error std::out_of_range
Функция at
пытается быть безопасной - она сначала проверяет длину вектора, затем возвращает элемент данного индекса или выдает std::out_of_range
, если вектор не содержит элемент такогоindex.
Второй случай:
vec[i].setVec(tmp); //Crashes the whole programm
Оператор []
ведет себя так же, как функция at()
для векторов, но это не "безопасно", так как оно не делает никаких границ.проверка.Следовательно, если вы пытаетесь получить доступ к 4-му элементу 3-элементного элемента, вы просто получаете доступ к некоторому случайному месту в вашей памяти (это может быть другая, не связанная переменная, например, может быть что-то еще).Если вам повезет, ваша программа потерпит крах после этого.Если вам не повезло, у вас будут проблемы с повреждением памяти и очень странные ошибки, которые трудно найти.
Решение вашей проблемы:
a) Заменитьvec[i]
с vec.at(i)
- работайте так же (ну, чуть-чуть медленнее, но вы этого не почувствуете), и вы в безопасности.
b) Тогда: посмотритево всех местах, где вы на самом деле выполняете поиск векторов, и в каждом месте останавливаетесь на секунду и думаете: «Насколько велик этот вектор в данный момент? Я уверен, что элемент этого индекса существует?».
Скорее всего, вы быстро найдете свою ошибку.