C++ ASAN 启动分解声明

问题描述 投票:0回答:1

我做了一个leetcode问题,对于以下解决方案,ASAN正在努力:

class Solution {
public:

    vector<int> rightSideView(TreeNode* root) {
        if (root == nullptr) return vector<int>();
        int ans[205];
        memset(ans, -1, sizeof ans);
        queue<pair<TreeNode*,int>> q;
        int ml = 0;
        q.push({root, 0});
        while(!q.empty()) {
            const auto &[node, level] = q.front();
            q.pop();
            ml = max(ml, level);
            if (ans[level] == -1) ans[level]=node->val;
            if (node->right != nullptr) q.push({node->right, level+1});
            if (node->left != nullptr) q.push({node->left, level+1});
        }
        return vector<int>(ans,ans+ml+1);
    }
};

如果我将

const auto &[node,level]=q.front();q.pop();
替换为正常的
auto pair=q.front();node=pair.first,level=pair.second;
,效果很好。谁能帮助我理解上述解决方案中发生了什么?

c++ declaration address-sanitizer decomposition
1个回答
0
投票
const auto &[node,level]=q.front();q.pop();

您获得对前节点的引用,然后立即销毁获得悬空引用的节点。将

q.pop();
移动到循环体末端。

© www.soinside.com 2019 - 2024. All rights reserved.