c++ - 线程 1:启动 std::pair 数组时出现 EXC_BAD_ACCESS

标签 c++ arrays std-pair

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

数据格式为:

[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_];

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

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;
}

这是怎么回事?

最佳答案

edge_pairs_array 的大小可能约为 5.6 MB。它是一个自动变量,因此分配在所谓的“堆栈”上。堆栈的大小因系统而异,但在桌面系统上通常为一到几 MB。最有可能的是您遇到了“堆栈溢出”。

解决方案是从自由存储中分配如此大的对象。从自由存储区分配数组的最简单方法是使用 std::vector

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

关于c++ - 线程 1:启动 std::pair 数组时出现 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49646399/

相关文章:

c++ - 在 pair.first 上使用 std::move 是否会使 pair.second 无效?

c++ - 在 std::pair 支撑初始化中复制 vs move

c++ - 随机数生成器总是选择相同的数字

c++ - 我有一个数组 union 。从一个数组中读取一些元素并从另一个数组中读取其他元素是否可以?

c++ - cout doubles 不切割变量

混合了文字和数组的 Javascript 数组

c++ - std::Lock 避免了死锁,但该程序被卡住

java - 多维数组中 array.length 和 array[0].length 之间的区别?

javascript - JavaScript 二维数组中的算法

c++ - 在 std::pair 中使用 `std::make_pair`:C++ STL