https://leetcode.cn/problems/find-largest-value-in-each-tree-row/solution/

非常简单的一个bfs,但是提交时一直遇到编译器heap-use-after-free报错。

vector<int> largestValues(TreeNode* root) {
    
    vector<int> res;
    if(root==nullptr){
        return res;
    }
    queue<TreeNode*> q;
    q.push(root);
    while(q.size()>0){
        int times=q.size();
        int thisMax=q.front()->val;
        for(int i=0;i<times;i++){
            auto& n=q.front();
            q.pop();
            
            thisMax=max(n->val,thisMax);
            if(n->left!=nullptr){
                q.push(n->left);
            }
            if(n->right!=nullptr){
                q.push(n->right);
            }
        }
        res.push_back(thisMax);
    }
    return res;
    
}

找了半天bug,无果。直到看到了别人类似的经历才发现问题所在。

看起来没啥问题,其实问题出在这里。。

auto& n=q.front();
q.pop();

如果我去掉&,或者把pop( )放到n用完之后,就不会出现heap-use-after-free报错。

应该是运行时pop( )之后直接把q.front( )这个指针释放了。。导致n变成了空指针。如果去掉&的话是复制了一个指针,所以不会被q.front( )影响到。

c++里debug真是太难了。


I am a noob