У меня есть сложная структура данных, определенная как:
array<array<array<vector<arc>, 2>, n_ports + 2>, n_times> destinations;
где массив а также вектор короткие для std::array
а также std::vector
n_ports и n_times unsigned int
с и arc
это struct
:
struct node { uint port; bool pickup; uint time; };
struct arc { node destination; float cost; };
В основном, к тройке (I, J, K) где 0 <= i < n_times
, 0 <= j < n_ports+2
, 0 <= k < 2
Я связываю вектор дуг, размер которых я не могу знать априори.
Эти векторы не создаются последовательно и не являются их элементами. push_back
‘последовательно.
У меня проблема в том, что у меня гораздо больше дуг, чем должно быть, и я подозреваю, что это пережитки дуг, созданных ранее, а затем перемещенных (или скопированных?) куда-то еще, когда вектор должен был быть изменен.
Вот это самый минимальный пример того, что я делаю, что мне удалось создать, начиная с того, над чем я на самом деле работаю, и отображает проблему.
Любая помощь приветствуется. Я использую неправильную структуру данных? Должен ли я что-нибудь почистить после себя? и т.п.
Проблема в том, что вы получили время и порты в обратном направлении. Размеры ваших массивов: n_times для индекса порта и n_ports + 2 для индекса времени. Это, вероятно, приводит к доступу к массиву вне границ.
Помните, std::array
намного лучше, чем необработанные массивы, но все равно не будет проверять границы, если вы не используете at()
,
std::array
не проверяет индекс за пределами границ, поэтому код имеет утечки памяти, когда у вас есть порт и индексы времени в обратном направлении.