C++用vector实现邻接矩阵时出现Segmentation Fault问题求助
嘿,我看你在Windows下用clang++ 5.0.1搞邻接矩阵的时候碰到了段错误,而且一碰vertex_matrix就炸——这种情况十有八九是这个嵌套vector没被正确初始化,或者你访问的时候越界了。结合你提到的头文件,我给你列几个最容易踩的坑:
没给嵌套vector分配足够空间
邻接矩阵是二维结构,得先把外层vector的大小定下来,再给每个内层vector也分配空间才行。比如你有n个顶点,正确的初始化应该是这样:// 初始化n×n的矩阵,默认值设为0(或者用代表无穷大的数值表示无连接) std::vector<std::vector<int>> vertex_matrix(n, std::vector<int>(n, 0));要是你只声明了
std::vector<std::vector<int>> vertex_matrix;就直接去访问vertex_matrix[i][j],那肯定炸——这时候外层vector是空的,vertex_matrix[i]本身就是越界访问,直接触发段错误。类成员的初始化时机错了
如果vertex_matrix是你的Graph类的成员变量,得在构造函数里完成初始化,不能直接在类声明里瞎写(除非用C++11及以后的就地初始化,而且得是编译期常量)。举个正确的例子:class GraphMatrix { private: std::vector<std::vector<int>> vertex_matrix; int vertex_count; public: // 用构造函数初始化列表来搞定嵌套vector GraphMatrix(int n) : vertex_count(n), vertex_matrix(n, std::vector<int>(n, 0)) {} };要是你在类声明里写
std::vector<std::vector<int>> vertex_matrix(n, ...);,这绝对是错的——类声明阶段没法用非编译期常量初始化成员,结果就是vertex_matrix根本没被正确构造,后续访问自然崩。访问时索引越界了
就算你初始化对了矩阵,要是访问的i或者j超出了[0, vertex_count-1]的范围,照样炸。比如你的矩阵是5×5的,结果你去访问vertex_matrix[5][0],这就越界了,直接触发段错误。老版本clang的潜在bug?
这个可能性不高,但clang++ 5.0.1是2017年的老版本了,Windows平台下的clang对C++标准库的支持可能有一些小问题。要是上面的坑你都排查过了还是不行,可以试试升级clang版本,或者换MSVC编译试试,看看是不是编译器的锅。
对了,你贴的头文件代码不全,要是能把完整的类定义和初始化代码放出来,我能更精准地帮你定位问题~
内容的提问来源于stack exchange,提问作者cyber101

