尝试将广度优先搜索方法写入图形时出现分段错误

Posted

技术标签:

【中文标题】尝试将广度优先搜索方法写入图形时出现分段错误【英文标题】:Getting a segmentation fault when trying to write a Breadth First Search method to a graph 【发布时间】:2021-08-01 06:45:57 【问题描述】:

我已经注释掉了一些我用来测试我的代码的东西,但主要问题是当我运行它时,我得到了一个分段错误,你可以看到我已经注释掉了一个原本应该完成的函数方法广度优先搜索。 This is what happens when I compile the code using g++

#include <iostream>
#include <vector>
#include <queue>
#include <limits>
using namespace std;

struct Edge

  int src, dest;
;

class Graph

private:
  vector<vector<int>> adjList;
  int N;
  friend class BFS;

public:
  Graph() : N(0);
  Graph(const Graph &orig) : N(orig.N)
  
    vector<vector<int>> adjList = orig.adjList;
  
  Graph(vector<Edge> const &edges, int N) : N(N)
  

    adjList.resize(N);
    for (auto &edge : edges)
    
      adjList[edge.src].push_back(edge.dest);
    
  
  friend void printGraph(Graph const &graph);

  void addEdge(Edge &e)
  
    if (e.src < N && e.dest < N)
    
      adjList[e.src].push_back(e.dest);
    
    else if (e.src == N || e.dest == N)
    
      adjList.resize(++N);
      adjList[e.src].push_back(e.dest);
    
    else if (e.src >= N || e.dest >= N)
    
      cout << "ERROR: you cannot add a edge to a vertex more than 1 greater than old greatest vertex" << endl;
    
    else
    
      cout << "ERROR" << endl;
    
  
  /*
  int *BFS(int start)
  
    int cur = 0;
    int node;
    int len = this->N;
    static int *level = new int[len];
    for (int a = 0; a < len; a++)
    
      level[a] = numeric_limits<int>::max();
    
    queue<int> q;
    q.push(start);
    q.push(-1);

    while (!q.empty())
    
      node = q.front();
      if (node == -1)
      
        cur++;
        q.push(-1);
      
      else
      
        level[node] = cur;
      
      q.pop();
      for (int count = 0; count < this->adjList[node].size(); count++)
      
        if (level[count] == numeric_limits<int>::max())
        
          q.push(count);
        
      
    
    return level;
  
  */

  int size()
  
    return N;
  

  void DFS() const
  
  
;

class BFS

private:
  int cur;
  int node;
  int len;
  int start;
  int *level;
  queue<int> q;

public:
  BFS(Graph &g, int start) : cur(0), len(g.N), level(new int[len]), start(start)
  
    for (int a = 0; a < len; a++)
    
      level[a] = numeric_limits<int>::max();
    
    q.push(start);
    q.push(-1);
    while (!q.empty())
    
      node = q.front();
      if (node == -1)
      
        cur++;
        q.push(-1);
      
      else
      
        level[node] = cur;
      
      q.pop();
      for (int count = 0; count < g.adjList[node].size(); count++)
      
        if (level[count] == numeric_limits<int>::max())
        
          q.push(count);
        
      
    
    cout << "vertex"
         << "\tlevel" << endl;
    for (int i = 0; i < len; i++)
    
      cout << i << "\t" << level[i] << endl;
    
  
  ~BFS()
  
    delete[] level;
  
;

void printGraph(Graph const &graph)

  for (int i = 0; i < graph.N; i++)
  
    cout << i << " ——> ";
    for (int v : graph.adjList[i])
    
      cout << v << " ";
    
    cout << endl;
  


int main()


  vector<Edge> edges =
      
          0, 1, 1, 2, 2, 0, 2, 1, 3, 2, 4, 5, 5, 4;

  Graph graph(edges, 6);
  //Edge e = 6, 5, ;
  // cout << e.src << "\t" << e.dest << endl;
  //graph.addEdge(e);
  printGraph(graph);
  //int *p = graph.BFS(0);
  cout << "______________________" << endl;
  BFS b(graph, 0);
  /*
  for (int i = 0; i < graph.size(); i++)
  
    cout << i << "\t" << *(p + i) << endl;
  
*/
  return 0;

【问题讨论】:

避免分段错误的一种方法是减少(如果不是消除)对原始指针的需求。您在代码中使用了std::vector,但在这里没有使用它:static int *level = new int[len];。这可能只是static std::vector&lt;int&gt; level(len);。第二件事是删除您已注释掉的代码。无需发布整个屏幕的注释代码。 int *level; -- 未初始化。此外,如果意图是调用new[] 来初始化它,请不要这样做。取而代之(又一次):std::vector&lt;int&gt; level;,然后使用大小对其进行初始化,resize() it、push_back 等。不再需要将其设为指针。 【参考方案1】:

请检查第 140 行。有问题

if (level[count] == numeric_limits<int>::max())

GDB 来自 https://www.onlinegdb.com/ 表示当计数值为 32912 时,存在 sigsev。可能是数组长度有问题。

编辑: 您可以使用向量,或者如果您在 c++11 中中继想要数组,则可以使用 std::array 类型。

【讨论】:

以上是关于尝试将广度优先搜索方法写入图形时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试锁定共享内存互斥体时出现分段错误

访问共享进程内存时出现分段错误(核心转储)

将结构插入地图时出现分段错误

在向量中搜索时出现分段错误

尝试从方法返回指向对象的指针时出现分段错误

删除时出现分段错误