【问题标题】:Seg faults at particular line, can't figure out why特定线路的 Seg 故障,无法弄清楚原因
【发布时间】:2013-12-19 19:10:43
【问题描述】:

程序seg一旦到达这行代码就会出错(代码在函数set_array的Graph.cpp中。)

adjList[adjList.size()].push_back(Edge(vertex, 0));

基本上,我希望每次我需要使向量更长以适应更多链表时调用此行,因为该结构是链表的向量。这是声明链表向量及其内容的 .h 文件。每个节点都将包含一个顶点和一个权重。 (节点类称为class Edge。)

#ifndef GRAPH_H_INCLUDED
#define GRAPH_H_INCLUDED
//class MinPriority;
#include <iostream>
#include <string>
#include <vector>
#include <list>
using namespace std;
class Graph
{
public:
    Graph();
    ~Graph();
    void set_Edge(string targetVertex, string vertex, int weight);
    void set_array(string vertex);
    void print_Test();
    friend class MinPriority;
private:
    class Edge
    {
    public:
        Edge(string vertex, int weight)
        {m_vertex = vertex; m_weight = weight;}
        ~Edge(){}

        string m_vertex;
        int m_weight;
    };

    vector< list<Edge> > adjList; //declaration of the array of linked lists

};


#endif // GRAPH_H_INCLUDED

这就是我想要adjList[adjList.size()].push_back(Edge(vertex, 0)); 做的事情;基本上每次我想在图中插入一个新顶点时,我都会调用它。一旦我尝试将第一项放入树中,它就会出现故障。我会调用插入权重为“0”的“A”,它会立即出现段错误。顺便说一句,我正在尝试制作一个邻接列表,我使用adjList[adjList.size()].push_back(Edge(vertex, 0)); 在图中添加一个新的(未使用的)顶点。让我们假设这是传递给函数...

A B C D

执行此操作后,向量的长度应该增加 4。但当然它会在该行出现段错误(它在 GDB 中告诉我)。我对使用这种奇怪的数据结构非常陌生,因此非常感谢任何帮助。

【问题讨论】:

  • 你能告诉我们你声明 adjList[] 的代码吗?

标签: list vector segmentation-fault


【解决方案1】:

试试

adjList[adjList.size()-1]

数组的索引为 0..(size-1)。

例如,一个 4 元素数组的索引是 0、1、2 和 3。

如果数组可能为空,您可以添加逻辑以完全阻止任何访问--

if (adjList[adjList.size() > 0) ...

【讨论】:

  • 那行不通,因为如果我在一个空数组上调用 adjList.size(),它会尝试访问数组的第 -1 个元素,这也会使程序出现段错误。
【解决方案2】:

尝试转换你的数组索引:

adjList[int(adjList.size())]

或者用 0 试试?

编辑:似乎您必须在将 Edge 元素推入列表之前手动输入列表。

// Creation of independant lists
list<Edge> Eg, Ec;

Edge h("AB", 0);
Edge f("CD", 0);

adjList.push_back(Eg);
adjList[adjList.size()-1].push_back(h);
adjList.push_back(Ec);
adjList[adjList.size()-1].push_back(f);

// Return 2
cout << adjList.size();

我还没有找到其他方法。但我不是 C++ 专家。

【讨论】:

  • 第一次调用 adjList[adjList.size()].push_back(Edge(vertex, 0));代码行,如果 i cout ,adjList.size() 输出 0
  • 如果你输入简单的数字而不是 adjList.size() 是否有效?
  • 如果我把 0 它仍然是段错误。
猜你喜欢
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多