Поток 1: EXC_BAD_ACCESS при инициализации массива std :: pair

Я читаю сетевые данные из файла .txt, чтобы создать график с помощью библиотеки графов ускорения.

Формат данных:

[num_nodes] [num_edges]
[source_node] [target_node]
[from_node] [to_node] [arc_weight_1] [arc_weight_2]
...
[from_node] [to_node] [arc_weight_1] [arc_weight_2]

Например,

264346 733846
229246 264275
1 2 803 2008
...
259707 261228 389 389

В следующем фрагменте кода я инициализирую массив пар для хранения пары узлов от / до каждого ребра.

Переменные, заканчивающиеся подчеркиванием, являются переменными-членами класса.

std::ifstream infile("USA.txt");
infile >> num_nodes_ >> num_edges_ >> source_ >> target_;

std::pair<int, int> edge_pairs_array[num_edges_];

Тем не менее, последняя строка дает мне эту ошибку:

Сообщение об ошибке

Я не могу понять, почему. Этого не может быть, потому что 733846 элементов слишком велики для массива.

В качестве проверки работоспособности я написал это в отдельном файле, и он работает без проблем:

int main() {
std::ifstream infile("USA.txt");
int num_nodes, num_edges, source, target, u, v, x, y;
infile >> num_nodes >> num_edges >> source >> target;
std::pair<int, int> edge_pairs_array[num_edges];
for (int i = 0; i < num_edges; i++) {
infile >> u >> v >> x >> y;
edge_pairs_array[i] = std::make_pair(u, v);
}
return 0;
}

Что тут происходит?

2

Решение

Размер edge_pairs_array вероятно около 5,6 МБ. Это автоматическая переменная, и поэтому она размещается в так называемом «стеке». Размер стека варьируется в зависимости от системы, но обычно составляет от одного до нескольких МБ в настольных системах. Скорее всего, у вас «переполнение стека».

Решение состоит в том, чтобы выделить такие крупные объекты из бесплатного магазина. Самый простой способ выделить массив из свободного хранилища — это использовать std::vector,

Программа плохо сформирована в стандарте C ++, так как num_edges_ не является постоянной времени компиляции. В качестве размера автоматического массива могут использоваться только константы времени компиляции.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector