2016-12-06 3 views
0

при работе с Valgrind, он получает 2 утечек памяти, что я не могу понять, откуда это исходит от ..проверка утечек памяти проблемы

вот ошибки, данные Valgrind:

==22759== 192 bytes in 12 blocks are definitely lost in loss record 1 of 3 
==22759== at 0x4C2E0EF: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==22759== by 0x402ABA: FigureCard::clone() (Card.cpp:139) 
==22759== by 0x403464: Deck::operator=(Deck const&) (Deck.cpp:39) 
==22759== by 0x40A8A4: Game::Game(char*) (Game.cpp:51) 
==22759== by 0x40FACC: main (reviiyot.cpp:18) 
==22759== 
==22759== 5,280 bytes in 330 blocks are definitely lost in loss record 2 of 3 
==22759== at 0x4C2E0EF: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==22759== by 0x4030CC: NumericCard::clone() (Card.cpp:228) 
==22759== by 0x403464: Deck::operator=(Deck const&) (Deck.cpp:39) 
==22759== by 0x40A8A4: Game::Game(char*) (Game.cpp:51) 
==22759== by 0x40FACC: main (reviiyot.cpp:18) 

клон() в карты:

Card* NumericCard:: clone() 
{  
     Card* c=new NumericCard(*this); 
     return c; 
} 

оператор = в колоде:

Deck& Deck:: operator=(const Deck& other) 
{ 
    clean(); 
    vector <Card*> *c=new vector<Card*>; 
    c->clear(); 
    for(int i=0;i<((int)other.getCards()->size());i++) 
    { 
     Card* c1=other.getCards()->at(i)->clone(); 
     c->push_back(c1);  
    } 
    this->cards=c; 
    return *this;  
} 

FigureCard т е р:

FigureCard :: FigureCard(const Shape &shape,const Figure &figure):Card(shape),figure(figure){} 

Card т е р:

Card::Card(Shape Pshape):shape(Pshape){} 

NumericCard т е р:

NumericCard :: NumericCard(const Shape &shape,const int &number):Card(shape),number(number){} 

DealCards- когда я посылаю указатель карты на LinkedList игрока указателей карты :(поэтому я использую указатель карты)

void Deck:: dealCards(vector<Player*> players){ 
    for(int j=0;j<((int)players.size());j++){ 
     for(int i=0;i<7;i++){ 

      Card* c=this->fetchCard(); 
      players.at(j)->addCard(*(c)); 
     delete c; 

     } 

     players.at(j)->removeQuatro(); //check for reviiya 
    } 

    for(int i=0;i<((int)players.size());i++){ 
     players.at(i)->setInitialState(); 
    } 
    this->initiaState=this->toString(); 
} 

fetchCard:

Card* Deck:: fetchCard(){//Returns the top card of the deck and remove it from the deck  
     if(cards!=NULL){ 
     if(!(this->cards->empty())){ 
      Card* temp=cards->front(); 
      cards->erase(cards->begin()); 
      return temp; 

     } 
     else{ 
      return NULL; 
      } 
     } 
     else{ 
      return NULL; 
     } 
    } 

ясно из LinkedList:

void linkedList::clear() 
    { 
     link* temp=first; 

     while (temp != nullptr) { 
      first=temp->getNext(); 
      temp->removeLinkToTrash(); 
      temp=first; 
     } 

    } 

removeLinkToTrash:

void link :: removeLinkToTrash(){ 
    if(this->getPrev()!=NULL) // if it's not first link 
     this->prev->next=this->next; 
    if(this->getNext()!=NULL) //if its not last card 
     this->next->prev=this->prev; 
     clear(); 
} 

ясно из ссылки:

void link:: clear(){ 
      delete this->data; 
      delete this; 
    } 

Deck деструктор - если в конце концов, он все еще есть карты:

Deck::~Deck() { 
    clean(); 


} 

void Deck:: clean(){ 
    if(cards!=NULL){ 
     for(int i=0;i<((int)cards->size());i++){ 
      delete cards->at(i); 

    } 
    } 
    delete cards; 

} 

благодаря

+0

Просьба указать [mcve] – NathanOliver

+1

Почему вы используете raw-указатель C? A 'unique_ptr ', а затем 'vector >' должно быть лучше. И нужен ли указатель? Почему бы не использовать 'vector '? – Boiethios

+0

Можете ли вы показать цифровую карточку и карту цифр? –

ответ

1

Что я хотел бы предложить вам, чтобы использовать unique_ptr. Это безопасный для хранения данных класс C++, который обертывает классические C-указатели. Вы создаете его с помощью make_unique (аргументы конструктора), вам не нужно беспокоиться о новом/удалении, вы можете получить классический C-указатель от него с помощью метода get(), если вам действительно нужно переместить право собственности на ресурс, который он содержит в anotehr unique_ptr с move().

Смежные вопросы