«Утверждение не удалось» на деструкторе - PullRequest
1 голос
/ 15 марта 2011

кто-нибудь знает, что не так с этим ?? он продолжает выдавать мне «Ошибка подтверждения» _BLOCK_TYPE_IS_VAILD (pHead-> nBlockUse), когда он пытается использовать детектор в непустом стеке РЕДАКТИРОВАТЬ: БОЛЬШЕ КОДОВ:

class stack
{
private:
   struct StackNode
   {
      int x;
      int y;
      StackNode *next;  
   };

   StackNode *top;     

public:

   stack()
      {  top = NULL; }

   ~stack();

 stack::~stack()
    {
        StackNode *nodePtr,*nextNode;
            nodePtr=top;
            while (nodePtr!=NULL) 
            { 
                nextNode=nodePtr->next;
                delete nodePtr;
                nodePtr=nextNode;
            }   
    }

main.cpp

mouse_position.push(mouse_x,mouse_y);
print_stack(mouse_position);

void print_stack(stack m)
{
    int tempx=0;
    int tempy=0;
//  while(!m.isEmpty()){
//      m.pop(tempx,tempy);
    cout<<tempx<<tempy<<endl;
//  }

}

Ответы [ 3 ]

4 голосов
/ 15 марта 2011

Судя по опубликованному вами коду, проблема заключается в отсутствующем конструкторе копирования. Рассмотрим следующий код:

stack mouse_position;
// fill mouse_position
print_stack(mouse_position);

Когда вы звоните print_stack, вы делаете побитовую копию mouse_position. Когда выходит print_stack, эта копия (а именно m) уничтожается, вызывая delete на своем элементе top, который точно такой же top из mouse_position. Когда mouse_position удаляется, вы удаляете его top дважды.

Опять же, в коде, который вы еще не опубликовали, может быть больше ошибок.

2 голосов
/ 15 марта 2011

Вы копируете свой стек, когда переходите в print_stack и не следуете правилу трех Что такое правило трех? , которое приводит к двойному удалению и вашей проблеме.

Если вы не выполняете это как упражнение, используйте std::stack - он проверялся и отлаживался годами.

2 голосов
/ 15 марта 2011

На что посмотреть:

  1. В StackNode нет деструктора.
  2. Есть два определения stack деструктор.
  3. Отсутствует закрывающая скобка для class stack.
  4. Рассмотрите возможность перемещения StackNode за пределы класс.
  5. Предпочитают использовать std::stack и std::list.

Отредактируйте свой пост, чтобы показать больше контекста для более подробной помощи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...