在递归中使用引用导致内存泄漏?

时间:2016-05-08 17:40:23

标签: c++ recursion reference

Minimal, Complete, and Verifiable example.

#include <vector>
#include <string>
#include <iostream>
using namespace std;

class node
{
    public:
        vector<int> node_connections;
        string content;
};



int find_remaining_paths(node & a)         //reference causing crash
{
    for (int i = 0; i < a.node_connections.size(); i++)
    {
        if (a.node_connections[i] != -1)    //if not visited
        {
            a.node_connections[i] = -1;     //path marked as visited
            return i;                       //return index in nodes
        }
    }
    return -1;                              //no paths remaining
}

void find_euler_circuits(vector<node> & nodes, node & a)
{
    cout << a.content << " ";
    int temp = find_remaining_paths(a);    //finds next path in vector, if one exists
    if (temp+1)                            //if there's a remaining path in node a
    {
        find_euler_circuits(nodes, nodes[a.node_connections[temp]]);  //crashes here
    }
    return;
}



int main()
{
    vector<node> nodes;

    node a;      //nodes[0]
    node b;      //nodes[1]
    node c;      //nodes[2]
    node d;      //nodes[3]

    a.content = "a";
    b.content = "b";
    c.content = "c";
    d.content = "d";

    a.node_connections.push_back(1);        // a --> b
    a.node_connections.push_back(3);        // a --> d
    b.node_connections.push_back(2);        // b --> c
    c.node_connections.push_back(0);        // c --> a

    nodes.push_back(a);
    nodes.push_back(b);
    nodes.push_back(c);
    nodes.push_back(d);

    find_euler_circuits(nodes, nodes[0]);   // a is starting node
}

我正试图在多图中找到所有的euler路径。在这种情况下,使用节点来表示顶点。这是个主意:

例如:

nodes[0] holds node a
nodes[1] holds node b
nodes[2] holds node c
nodes[3] holds node d


Connections:

a --> b
a --> d
b --> c
c --> a

因此节点'a'保存索引整数1,3(b,d)

节点'b'包含索引整数2(c)

节点'c'包含索引整数0(a)

使用递归,程序跨越图表:

(a[0] = b) -> (b[0] = c) -> (c[0] = a) -> (a[1] = d)

(我知道这种方法找不到euler路径,但我必须先让它工作)

逻辑本身工作正常,如果我删除引用&amp;然后它只是永远循环[0] - &gt; b [0] - &gt; c [0] - &gt; a [0] - &gt;等,但随着参考,它到达

后立即崩溃
find_euler_circuits(nodes, nodes[a.node_connections[temp]]);

有人能告诉我为什么会导致上述程序出现分段错误吗? 引起崩溃的引用在

int find_remaining_paths(node & a)   //loops forever without &, crashes with &

此外,递归应该在它到达没有路径的节点时立即停止,但这不是问题所在,因为它在访问一个节点后崩溃

1 个答案:

答案 0 :(得分:1)

要回答有关“删除引用”为何会使其永久循环的部分问题:&的原型上没有引用(find_euler_circuits),因此它看起来像find_euler_circuits(vector<node> nodes, node a) < em>如果这就是你的意思(*)那么你正在制作载体和节点的副本 - 它会在其中制作载体的副本 - 每次拨打电话时,您设置为-1的值都不在您认为的数组中。

当你拥有引用时它崩溃的原因 - 在find_remaining_paths中你将a.node_connections[i]设置为-1,然后返回i,然后在调用者中引用{ {1}} ...即-1。至少,这就是我在阅读代码的方式......

(*)你真的应该提供你在“删除引用”时得到的代码,无论这意味着什么。