I\'ve been working with a school project, and one of the tasks is to make sure it doesn\'t leak at all. So, I ran my program through valgrind, and because I\'m not using an
It's important to understand the difference between leaking memory on a repeated basis (which can lead to exhaustion), and having some underlying support code or library have a one-off intialisation step that gets some heap memory it will use while the program runs (in which case it's not really useful or necessary to free/delete the memory at program termination, and it may be quite a hassle trying to arrange it).
Here, __cxa_get_globals seems to be doing a one-off malloc.
Short story: just make sure you don't get multiple unreleased blocks (or a bigger one) when those exceptions are called repeatedly....
Exceptions are better used for exceptional use cases though, here they will occur quite often (at least 4 times per outer loop...)
This can easily be refactored:
typedef std::vector< std::vector<int> > board_type;
namespace {
bool check(board_type const& board, int val, int w1, int h1, int w2, int h2)
{
if (w1 < 0 || w2 < 0) { return false; }
if (w1 >= board.size() || w2 >= board.size()) { return false; }
if (h1 < 0 || h2 < 0) { return false; }
if (h1 >= board[w1].size() || h2 >= board[w2].size()) { return false; }
return board[w1][h1] == val && board[w2][h2] == val;
}
} // anonymous namespace
bool connect3::checkIfPositionIsBaseCase(Position aPosition) const {
vector< vector< int > > thisP = aPosition.getBoard();
bool encounteredZero = false;
for( int w = 0; w < thisP.size(); w++ ) {
for( int h = 0; h < thisP.at(w).size(); h++ ){
int val = thisP[w][h];
if (val == 0) { encounteredZero = true; continue; }
// Check in all directions with a clock-wise rotation
if (check(thisP, val, w-1, h-1, w-2, h-2)) { return true; }
if (check(thisP, val, w , h-1, w , h-2)) { return true; }
if (check(thisP, val, w+1, h-1, w+2, h-2)) { return true; }
if (check(thisP, val, w+1, h , w+2, h )) { return true; }
if (check(thisP, val, w+1, h+1, w+2, h+2)) { return true; }
if (check(thisP, val, w , h+1, w , h+2)) { return true; }
if (check(thisP, val, w-1, h+1, w-2, h+2)) { return true; }
if (check(thisP, val, w-1, h , w-2, h )) { return true; }
}
}
return !encounteredZero;
}
And there won't be any exception there :) I also find it easier to verify that the checks are correct and exhaustive...