Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Debug Assertion Failed


Автор: Ander 23.2.2004, 06:02
Вот, наваял чего-то со списками. При запуске выдаёт таблицу со следующим содержанием, при этом список она всё-таки выводит (здесь файлы можно как-нибудь прикрепить?):

Debug Assertion Failed!
Program: bla-bla-bla\mylist1.exe
File: dbgheap.cLine:1044

Expression: _CrtIsValidHeapPointer(PUserData)

Смотрел хелп - так и не понял, в чём дело.
Код:
Цитата

#include <iostream>
#include <time.h>
#include <stdlib.h>
#define list node*
using namespace std;

void main(void)
{
srand(unsigned int(time(NULL)));
const N=10;
struct node
{
  int n;
  node* next;
  node(int v, node* t)
  {
  n=v;
  next=t;
  }
};

list base=new node(0,NULL);
list x=base;
for(int i=1; i<N; i++)
{
  x->next=new node(rand(),base);
  x=x->next;
}

                x=base;
do
{
  cout << x->n << endl;
  x=x->next;
}while(x!=base);

x=base;
do
{
  base=x;
  x=x->next;
  delete base;
}while(x!=NULL);
}



Автор: mr.DUDA 23.2.2004, 15:03
Список кольцевой, так ?

Значит,
Цитата
do
{
  base=x;
  x=x->next;
  delete base;
}while(x!=NULL);

пройдёт по 10-ти элементам, удалив их, а перед удалением последнего - настроит указатель "x" на значение "next" из последнего элемента, которое указывет на самый первый (уже удалённый !) элемент.

Чего тут сделать можно ? Запомнить указатель на первый элемент, и сравнивать "x" не с NULL, а с этим указателем:
Цитата
list first = base;
do
{
  base=x;
  x=x->next;
  delete base;
}while(x!=first);

Автор: Ander 23.2.2004, 20:14
Да, теперь всё работает, но я не понимаю:

Цитата

а перед удалением последнего - настроит указатель "x" на значение "next" из последнего элемента, которое указывет на самый первый (уже удалённый !) элемент.


разве в этом случае x не должен указывать на NULL?

Автор: mr.DUDA 23.2.2004, 21:13
Цитата
разве в этом случае x не должен указывать на NULL?

нет. список кольцевой:
Цитата
list base=new node(0,NULL);
list x=base;
for(int i=1; i<N; i++)
{
  x->next=new node(rand(),base);
  x=x->next;
}

в выделенной строке создаётся элемент списка, в конструктор которого передаётся указатель на первый элемент (base) списка. Далее, из строки "x->next=" получается что все элементы, кроме последнего, настроены своим "next" на следующий элемент (ведь для последнего элемента цикл не выполняется !). Последний элемент настроен указателем "next" на первый элемент, а не на NULL.

Автор: Ander 24.2.2004, 01:53
Теперь ясно. Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)