C++ 线程1:启动std::pair数组时EXC_错误访问

C++ 线程1:启动std::pair数组时EXC_错误访问,c++,arrays,std-pair,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 80

我正在从一个.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
在下面的代码片段中,我将初始化一个对数组,以存储每条边的from/to节点对

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

std::ifstream infle(“USA.txt”);
填充>>节点数>>边数>>源节点数>>目标节点数;
std::pair edge_pairs_数组[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;
}
intmain(){
标准::ifstream infle(“USA.txt”);
int num_节点、num_边、源、目标、u、v、x、y;
填充>>数量节点>>数量边缘>>源>>目标;
std::pair edge_pairs_数组[num_edges];
对于(int i=0;i>u>>v>>x>>y;
边对数组[i]=std::make对(u,v);
}
返回0;
}

这里发生了什么?

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

解决方案是从免费商店分配如此大的对象。从空闲存储分配数组的最简单方法是使用
std::vector


<程序>标准C++中的格式不正确,因为 NUMYEDEGESSI不是编译时常数。只有编译时常量可以用作自动数组的大小。

可以。您正在堆栈上创建此数组。您可以使用std::vector或将其放在堆上。据我所知,Boost Graphs库要求它是一个数组。但更重要的是,我只想知道问题的原因。@kseulgi你从那条评论中得出了错误的观点。它是一个数组不是问题。它可能在堆栈上。无论如何,
vector
允许您通过
.data()
获取数组,即使是这样,也比手动分配更安全/更好。@下划线d Ahh,感谢您的澄清。我会调查的!谢谢你的解释!我会尽力听从你的建议。
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;
}