带有向量的push_back上的SIGTRAP,没有设置断点

时间:2013-05-07 11:33:26

标签: c++ memory-management graph vector push-back

我正在尝试使用随机版本的Prim算法生成图形的生成树。但是,我的程序在生成树生成阶段崩溃,仔细检查发现了三个不同的错误。

1)在usedEdges.push_back(*i);(在下面的代码中)收到SIGTRAP,其中usedEdges的类型为std::vector<Edge>

2)在图表的代码中收到SIGTRAP,行非常相似:edges_[edge.From()].push_back(edge);,其中edges_的类型为std::vector<std::list<Edge> >

3)有几次,当我尝试将边缘的信息打印到终端时,我收到了一个SEGFAULT,虽然我无法重现它很多次。

如果我理解正确,我收到SIGTRAP的事实意味着Windows因内存损坏而触发某种错误?如果是这样,我的记忆在哪里被破坏了?

生成生成树的代码如下。 maze_成员是一个图表,它在内部存储节点&amp;矢量和矢量中的边缘邻接清单。

typedef std::set<int>                   NodeSet;
typedef std::list<Edge>                 EdgeList;
typedef std::vector<EdgeList>           AdjacencyList;

AdjacencyList       adjacencyList;
std::vector<Edge>   usedEdges;
NodeSet             usedNodes;

//generate grid nodes
for (int i = 0; i < height_; i++)
{
    for (int j = 0; j < width_; j++)
    {
        Node node(maze_.GetNextFreeNodeIndex());
        //nodes.push_back(node);
        maze_.AddNode(node);
        adjacencyList.push_back(std::list<Edge>());
    }
}

//generate grid edges
for (int i = 0; i < height_; i++)
{
    for (int j = 0; j < width_; j++)
    {
        int k = i * width_ + j;

        if (i > 0)
        {
            Edge edge(k, k - width_);
            adjacencyList[k].push_back(edge);
        }

        if (i < height_ - 1)
        {
            Edge edge(k, k + width_);
            adjacencyList[k].push_back(edge);
        }

        if (j > 0)
        {
            Edge edge(k, k - 1);
            adjacencyList[k].push_back(edge);
        }

        if (j < width_ - 1)
        {
            Edge edge(k, k + 1);
            adjacencyList[k].push_back(edge);
        }
    }
}

///Randomized Prim's algorithm
//mark first used node, and add all edges leading from this node to the used edge list.
usedNodes.insert(0);
EdgeList edgeList = adjacencyList[0];
for (EdgeList::iterator i = edgeList.begin(); i != edgeList.end(); i++)
{
    usedEdges.push_back(*i);
}

while (!usedEdges.empty())
{
    int id = LC::rand() * usedEdges.size() - 0.5;
    Edge edge = usedEdges[id];
    if (usedNodes.find(edge.To()) == usedNodes.end())
    {
        maze_.AddEdge(edge);
        usedNodes.insert(edge.To());
        edgeList = adjacencyList[edge.To()];
        for (EdgeList::iterator i = edgeList.begin(); i != edgeList.end(); i++)
        {
            usedEdges.push_back(*i);
        }
    }
    else
    {
        usedEdges.erase(usedEdges.begin() + id - 1);
    }
}

到目前为止我尝试过的事情: 重建项目,尝试将实际断点设置到代码中以观察变量,但到目前为止还没有看到任何与众不同的东西。然后我再也不确定我应该寻找什么......

修改

Edge类声明是

class Edge
{
public:
    //Edge(const Edge& edge);
    Edge(int from, int to, float cost);
    Edge(int from, int to);
    Edge();
    virtual ~Edge();

    friend std::ostream& operator<<(std::ostream& os, const Edge& edge);

    int     From() const;
    void    SetFrom(int index);

    int     To() const;
    void    SetTo(int index);

    float   Cost() const;
    void    SetCost(float cost);

    bool operator==(const Edge& rhs);

    bool operator!=(const Edge& rhs);


protected:
    int from_;
    int to_;
    float cost_;
};

0 个答案:

没有答案