leetcode 1091
我用引用获取栈顶元素后再将栈顶元素立即pop出栈,后面某些测试用例会出现
==32==ERROR: AddressSanitizer: heap-use-after-free on address 0x615000027878 at pc 0x000000347b77 bp 0x7ffd5ce6fc50 sp 0x7ffd5ce6fc48
READ of size 4 at 0x615000027878 thread T0
之类的错误,不是每个测试用例都出,过了64个测试用例,总是在第65个测试用例出。
如果改成变量赋值就没问题;或者在使用完引用之后再pop掉栈顶元素也不会有问题。有人能解释一下原因吗?
另外STL stack 缺省是用vector还是用链表实现的,如果是vector在什么时候会将pop出栈的元素占用的内存回收?这种情况究竟怎样写代码比较安全?
class Solution {
int n;
inline bool isValid(int x,int y) {
if(x>=0 && x<n && y>=0 && y<n)
return true;
return false;
}
public:
int shortestPathBinaryMatrix(vector<vector<int>>& grid) {
int n=grid.size();
this->n=n;
if(n<1 || grid[0][0]!=0 || grid[n-1][n-1]!=0) return -1;
queue<pair<int,int>> q; // x,y
q.push({0,0});
grid[0][0]=1;
vector<vector<int>> dirs={{0,1},{0,-1},{1,0},{-1,0},{1,1},{-1,-1},{-1,1},{1,-1}};
while(!q.empty()) {
auto& p=q.front();q.pop(); //出问题,改成下行没有问题 或者拆分成后面 **** 的两行也没有问题
//auto p=q.front();q.pop(); //没问题
//auto& p=q.front(); //// **** 配合在最后pop栈顶元素,没问题
if(p.first==n-1 && p.second==n-1) {
return grid[p.first][p.second];
}
for(auto dir:dirs) {
int newX=p.first+dir[0],newY=p.second+dir[1];
if(isValid(newX,newY) && grid[newX][newY]==0) {
q.push({newX,newY});
grid[newX][newY]=grid[p.first][p.second]+1;
}
}
//q.pop(); //// **** 此时pop栈顶元素,即使用引用也不会有问题
}
return -1;
}
};
--
FROM 119.251.19.*