c++ - 递归克隆图时的stackoverflow

标签 c++ recursion

我在使用此版本的代码时遇到错误“AddressSanitizer .. stackoverflow in operator new (unsigned long)”,我在其中使用了copy->neighbors.push_back

class Node {
public:
    int val;
    vector<Node*> neighbors;
    Node() {}
    Node(int _val, vector<Node*> _neighbors) {
        val = _val;
        neighbors = _neighbors;
    }
};
unordered_map<Node*, Node*> copies;
Node* cloneGraph(Node* node) {
        if(!node) return node;
        if(copies.find(node)==copies.end()){
            Node *copy = new Node(node->val,{});
            for(auto neighbor:node->neighbors){
                 copy->neighbors.push_back(cloneGraph(neighbor));//stackoverflow 
            }
            copies[node]= copy;
        }
        return copies[node];
}

但它适用于我使用 copies[node]->neighbors.push_back 的这个版本,为什么会这样?
唯一的区别是使用对全局 map 元素的引用:copies[node] 与本地指针copy

Node* cloneGraph(Node* node) {
        if(!node) return node;
        if(copies.find(node)==copies.end()){
            copies[node] = new Node(node->val,{});
            for(auto neighbor:node->neighbors){
                copies[node]->neighbors.push_back(cloneGraph(neighbor));
            }
        }
        return copies[node];
    }

最佳答案

在您的第一个实现中,您将在每次递归调用时创建一个新节点,并将其推送到堆栈。然而,在您的第二个实现中,它被放置在一个数组中,该数组不是局部递归变量的一部分(它看起来像一个全局变量),因此堆栈不需要跟踪新创建的节点。

关于c++ - 递归克隆图时的stackoverflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57776124/

相关文章:

c++ - 在函数中传递字符串或 wstring

c++ - uint64_t t3 = MAXDWORD + 1 == 0?

c++ - 为什么宇宙飞船允许混合比较(不同的模板实例)与无意义的结果?

c - 解释一下下面代码的输出?

java - 优化递归算法以查找与特定正则表达式匹配的节点

javascript - ANN : Recursive backpropagation

java - 如何从 JNI 调用类方法并将返回值强制转换为自定义类

c++ - 指针可以指向4GB之后的地址吗?

php - 查找 child 部门的员工 - PHP

javascript - 从嵌套对象树获取路径