我做了一个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;
,效果很好。谁能帮助我理解上述解决方案中发生了什么?
const auto &[node,level]=q.front();q.pop();
您获得对前节点的引用,然后立即销毁获得悬空引用的节点。将
q.pop();
移动到循环体末端。