Leak in Exception Code C++

前端 未结 2 1016
谎友^
谎友^ 2020-12-18 17:04

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

相关标签:
2条回答
  • 2020-12-18 17:24

    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....

    0 讨论(0)
  • 2020-12-18 17:32

    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...

    0 讨论(0)
提交回复
热议问题