The pasted code below returns a heap-use-after-free
error. When I remove the reference symbol '&' on the line with coord &c = q.front(); q.pop();
, the error is resolved.
From what I understand, the C++ garbage collector deletes the coord I retrieved from q.front() when there are no more references to it. Though it seems here that the c in coord &c
is removed from the heap immediately after it is popped from the queue, and attempting to access c in the next line causes the error.
However, this does not happen every time, so I'm wondering why this is occurring.
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
if(grid.size() == 0) return 0;
typedef pair<int,int> coord;
queue<coord> q;
const int m = grid.size();
const int n = grid[0].size();
int i_in[] = {0,0,1,-1};
int j_in[] = {1,-1,0,0};
int ans = 0;
for(int i = 0; i < m; ++i)
{
for(int j = 0; j < n; ++j)
{
if(grid[i][j] == '1')
{
++ans;
q.push(coord(i,j));
while(q.size() > 0)
{
coord &c = q.front(); q.pop();
grid[c.first][c.second] = '*';
for(int k = 0; k < 4; ++k)
{
int newi = c.first + i_in[k];
int newj = c.second + j_in[k];
if(newi >= 0 && newi < m &&
newj >= 0 && newj < n &&
grid[newi][newj] == '1')
{
q.push(coord(newi, newj));
}
}
}
}
}
}
return ans;
}
};