返回后,C ++函数输出会发生变化

时间:2018-11-07 04:00:24

标签: c++

我试图从图的DFS遍历中获取树木的向量,但是结果从函数返回后会改变。

这是Tree类:

template <typename T>
class Tree
{
public:
    T v;    // value of current node
    // List of subtrees
    std::list<Tree<T>*> children;
    // Pointer to parent
    Tree<T> *parent;
    Tree(T v) {
        this->v = v;
    }
}

这是函数的相关部分

    for (int i = 0; i < V; ++i)
        trees.push_back(Tree<T>(info[i]));

    int parent, node;
    std::vector<int> roots;
    for (int i = 0; i < V; ++i) {
        parent = parents[i];
        node = path[i];

        if (parent != -1) {
            trees[parent].children.push_back(&trees[node]);
            trees[node].parent = &trees[parent];
        }
        else {
            roots.push_back(node);
        }
    }
    for(int node_i : roots)
        res.push_back(trees[node]);
    return res;

和变量声明如下:

        template <typename T>
    std::vector<Tree<T>> DFSTree(std::vector<T> &info) {
    std::vector<Tree<T>> res;
    std::vector<int> path;
    std::vector<int> parents;
    std::vector<Tree<T>> trees;

结果向量的子级中的Tree没有设置任何子级。 抱歉,这是一个基本问题,但我在任何地方都找不到答案。 谢谢您的回复

1 个答案:

答案 0 :(得分:0)

您的Tree类中有指针。当您使用res.push_back(trees[node])复制树节点时,子指针和父指针仍指向trees,而不是res。函数返回后,trees超出范围,并且其内存被释放,res中的指针指向已删除的内存。

解决方法是重新考虑设计,以免使用指针。