线程 1:EXC_BAD_ACCESS 同时启动 std::pair 数组
Thread 1: EXC_BAD_ACCESS while initiating std::pair array
我正在从 .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 个节点对。
下划线结尾的变量是class个成员变量。
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;
}
这是怎么回事?
edge_pairs_array
的大小大概是5.6MB左右。它是一个自动变量,因此分配在所谓的 "stack" 上。堆栈的大小因系统而异,但在桌面系统上通常为一到几 MB。最有可能的是您已经 "stack overflow".
解决方案是从 free-store 分配这么大的对象。从 free-store 分配数组的最简单方法是使用 std::vector
.
该程序在标准 C++ 中是 ill-formed,因为 num_edges_
不是编译时常量。只有编译时常量可以用作自动数组的大小。
我正在从 .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 个节点对。
下划线结尾的变量是class个成员变量。
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;
}
这是怎么回事?
edge_pairs_array
的大小大概是5.6MB左右。它是一个自动变量,因此分配在所谓的 "stack" 上。堆栈的大小因系统而异,但在桌面系统上通常为一到几 MB。最有可能的是您已经 "stack overflow".
解决方案是从 free-store 分配这么大的对象。从 free-store 分配数组的最简单方法是使用 std::vector
.
该程序在标准 C++ 中是 ill-formed,因为 num_edges_
不是编译时常量。只有编译时常量可以用作自动数组的大小。