线程1:启动std :: pair数组时的EXC_BAD_ACCESS

时间:2018-04-04 08:38:21

标签: c++ arrays std-pair

我正在从.txt文件中读取网络数据,以使用Boost Graphs Library创建图表。

数据格式为:

[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

在下面的代码片段中,我初始化了一对数组,用于存储每条边的from / to节点对。

以下划线结尾的变量是类成员变量。

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

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

但是,最后一行给出了这个错误:

Error message

我无法弄清楚原因。这不可能是因为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;
}

这里发生了什么?

1 个答案:

答案 0 :(得分:2)

edge_pairs_array的大小可能约为5.6 MB。它是一个自动变量,因此分配在所谓的&#34; stack&#34;上。堆栈的大小因系统而异,但在桌面系统上通常为1到几MB。最有可能的是你有#34;堆栈溢出&#34;。

解决方案是从免费商店分配这样的大对象。从免费商店分配数组的最简单方法是使用std::vector

程序在标准C ++中格式不正确,因为num_edges_不是编译时常量。只有编译时间常量才能用作自动数组的大小。