Falseure утверждения убивает меня - PullRequest
0 голосов
/ 15 марта 2011

Я продолжаю получать _BLOCK_TYPE_IS_VALID (phead-> nBlockUse) во время выполнения. Я провел 3 часа, возиться с ним и обнаружил, что это как-то вызвано деструктором? Я понял, что когда мой стек пуст, проблем не было. но когда что-то было, это дало мне эту ошибку. Я проверил онлайн и мой деструктор, и я не знаю, что происходит. Вот мои все мои коды.

РЕДАКТИРОВАТЬ: я исправил ошибку, но теперь есть ошибка во время выполнения ...?

.cpp Я пытался

stack::~stack() ////PROBLEM STILL HERE??
{
     while (this)
   {

         top=top->next;
         int x,y;
         pop(x,y);
   }

}

stack::~stack()
{

   StackNode *nodePtr, *nextNode;
   nodePtr = top;
     while (nodePtr)
        {
      nextNode = nodePtr->next;
      delete nodePtr;
      nodePtr = nextNode;

   }

}

стек :: ~ стек () {

while (!isEmpty()) 
{ int x,y; pop(x,y); }


}

Ответы [ 4 ]

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

Проблема в деструкторе, так как вы не обновляете верх. Вместо того чтобы снова писать код для удаления элементов, вы можете просто вызвать функцию pop в цикле while.

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

Да. Проблема в деструкторе. Вы удаляете узлы там, но не обновляете указатель top. В результате ваш isEmpty() будет работать неправильно, поскольку он проверяет значение top.

Как исправить?

Вы уже позаботились об удалении узла в функции pop, зачем дублировать логику в деструкторе? Продолжайте вызывать pop из деструктора, пока стек не будет пустым.

1 голос
/ 15 марта 2011
stack::~stack()                   //PROBLEM HERE??
{
   StackNode *nodePtr, *nextNode;
   nodePtr = top;
     while (!isEmpty())
   {
      nextNode = nodePtr->next;
            delete nodePtr;
      nodePtr = nextNode;

   }

}
bool stack::isEmpty()
{

   if (!top)
      return true;
   else
      return false;

}

Эти двое кажутся как-то не правы. Представь, что твой stack не пустой. Это означает, что top указывает куда-то (поэтому не null). Чтобы ваш деструктор не мог получить доступ к памяти, он не должен использовать isEmpty(), который проверяет наличие null сверху Но в этом фрагменте кода top никогда не устанавливается на null. Рано или поздно вы запускаете delete -ную память, которой вы не владеете.

1 голос
/ 15 марта 2011

Посмотрите внимательно на взаимодействие между вашим деструктором и IsEmpty (). IsEmpty () проверяет top на пустоту, но ваш деструктор никогда не обновляет top после удаления головного узла.

Я бы, наверное, написал деструктор так:

stack::~stack()
{
  StackNode *nodePtr, *nextNode;
  nodePtr = top;

  while (nodePtr)
  {
    nextNode = nodePtr->next;
    delete nodePtr;
    nodePtr = nextNode;
  }
}
...