невозможно найти, где просочилась память - PullRequest
1 голос
/ 04 мая 2020

Привет, я сейчас работаю над своим первым объектно-ориентированным проектом c ++, и когда я использую valgrind для проверки утечки памяти, он выдает:

32 (24 direct, 8 indirect) bytes in 1 blocks are definitely lost in loss record 2 of 2
==1761165==    at 0x4839E86: operator new(unsigned long) (vg_replace_malloc.c:344)
==1761165==    by 0x403E5C: Game::Game() (game.cpp:3)
==1761165==    by 0x404711: Game::loadGame(std::istream&) (game.cpp:109)
==1761165==    by 0x4024B2: main (main.cpp:29)

Так что теперь я go для игры. cpp: 3, чтобы проверить, что произошло (в игре. cpp: 109, я назвал Game * temp_game = new Game), а в строке 3 я назвал конструктор

Game::Game() : game_entity(new EntityVec) {
}

Так что я думаю, что в какой-то момент я не освободил EntityVe c. Но после двойной проверки моего кода, особенно функции loadGame и моего деструктора:

Game *Game::loadGame(std::istream &in){
  Game* temp_game=new Game;
  temp_game->game_maze=Maze::read(in);
  if (temp_game->game_maze == nullptr) {
      delete temp_game;
      return nullptr;
  }
  char c;int x;int y;
  EntityControllerFactory* ecfac=EntityControllerFactory::getInstance();
  while (in>>c){
    Entity* temp_entity=new Entity;
    temp_entity->setGlyph(std::string(1,c));
    temp_game->addEntity(temp_entity);
    if (in >> c) {
        EntityController* temp_controller = ecfac->createFromChar(c);
        temp_entity->setController(temp_controller);
    }
    else {
        delete temp_game;
        return nullptr;
    }
    if (in >> c) {
        temp_entity->setProperties(std::string(1,c));
    }
    else {
        delete temp_game;
        return nullptr;
    }
    if((in>>x)&&(in>>y)){
        temp_entity->setPosition(Position(x,y));
      }
 else {
        delete temp_game;
        return nullptr;
    }
  }
  return temp_game;
}

Game::~Game(){

  delete game_ui;
  delete game_gameRules;
  delete game_maze;
  //delete[] game_entity;
  for(Entity* p: *game_entity){delete p;}
  //game_entity->clear();

}

Я не могу найти место, где я забыл освободить игру, если loadgame не удалась. (Если loadgame прошла успешно и вернула temp_game, то main должен обработал это, удалив это в конце). Кто-нибудь может дать мне несколько советов? Огромное спасибо.

1 Ответ

1 голос
/ 04 мая 2020

Каждый new должен иметь соответствующий delete. В вашем конструкторе Game вы используете new для создания game_entity - но деструктор не удаляет его (только его «члены»).

Вам нужен delete game_entity; после for l oop в деструкторе.

...