Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2010, 20:13   #1
Crudelis
Пользователь
 
Аватар для Crudelis
 
Регистрация: 05.04.2010
Сообщений: 56
Смущение Двусвязные списки, найти ошибку в коде

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

Код:
#include<iostream>
#include<time.h>
using namespace std;

template <typename T>
struct Elem
{
   T *mass;
   int ramzer;
   int size;
   int grow;
   Elem * next, * prev;
};
template <typename T>
class Array
{
   Elem<T> * Head, * Hvost;
   int count;
   int grow;
   int size;
public:
   Array();
   ~Array();
   void ShowAll();
   void DellSpis();
   void AddHead();
   void AddHvost();
   void SetSize(int size, int grow);
};
template<typename T>
Array<T>::Array()
{
	Elem<T> *temp=new Elem<T>;
	Head=Hvost=NULL;
	count=0;
	grow=1;
	size=0;
}
template<typename T>
Array<T>::~Array()
{
	while(count!=0)
	{
		DellSpis();
			count--;
	}
}
template<typename T>
void Array<T>::DellSpis()
{
	Elem<T> *temp=Head;
	Elem<T> *pDel=temp->prev;
	Elem<T> *aDel=temp->next;
	if(pDel!=0&&count!=1)
		pDel=aDel;
	if(aDel!=0&&count!=1)
		aDel=pDel;
	Head=aDel;
	delete[]temp->mass;
	delete temp;

}
template<typename T>
void Array<T>::AddHead()
{
	Elem<T> *temp=new Elem<T>;
	temp->grow=grow;
	temp->size=size;
	temp->mass=new T[temp->grow];
	temp->prev=0;
	for(int i=0;i<size;i++)
		temp->mass[i]=rand()%20;
	temp->next = Head;
	if(Head != 0)
      Head->prev = temp;
	if(count==0)
		Head=Hvost=temp;
	Hvost=temp;
	count++;
}
template<typename T>
void Array<T>::AddHvost()
{
	Elem<T> *temp=new Elem<T>;
	temp->grow=grow;
	temp->size=size;
	temp->mass=new T[temp->grow];
	temp->next=0;
	temp->prev=Hvost;
	for(int i=0;i<size;i++)
		temp->mass[i]=rand()%20;
	if(Hvost != 0)
      Hvost->next = temp;
	if(count==0)
		Head=Hvost=temp;
	Hvost=temp;
	count++;
}
template<typename T>
void Array<T>::ShowAll()
{
	Elem<T> *temp=new Elem<T>;
	temp=Head;
	while(temp!=0)
	{
	for(int i=0;i<temp->size;i++)
		cout<<temp->mass[i]<<" ";
		cout<<endl;
		temp=temp->next;
	}


}
template<typename T>
void Array<T>::SetSize(int size, int grow)
{
	this->size=size;
	while(size>grow){
		grow+=5;
	}
	this->grow=grow;
}
void main()
{
	setlocale(LC_CTYPE,"Rus");
	Array <int> List;
	List.SetSize(5,10);
	for(int i=0;i<5;i++)
		List.AddHvost();
	List.ShowAll();
}
сout<<"Изучаю программирование" точка с запятой
Crudelis вне форума Ответить с цитированием
Старый 15.07.2010, 06:53   #2
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

Особо не вникал, но метод Array<T>::DellSpis() заваливается при втором его вызове из-за того, что в процессе его работы по первому вызову Head становится пустым указателем. Если упростить этот метод до следующего вида, то вроде бы программка работает нормально:
Код:
template<typename T>
void Array<T>::DellSpis()
{
	Elem<T> *temp=Head;
	Head=temp->next;;
	delete[]temp->mass;
	delete temp;
}
Oleg_SK вне форума Ответить с цитированием
Старый 15.07.2010, 12:26   #3
Crudelis
Пользователь
 
Аватар для Crudelis
 
Регистрация: 05.04.2010
Сообщений: 56
По умолчанию

Oleg_SK, этот метод тоже пробовал, та же самая ошибка
сout<<"Изучаю программирование" точка с запятой
Crudelis вне форума Ответить с цитированием
Старый 15.07.2010, 12:43   #4
Crudelis
Пользователь
 
Аватар для Crudelis
 
Регистрация: 05.04.2010
Сообщений: 56
По умолчанию

по дебагеру вылетает ошибка в этой строке:
delete[]temp->mass;
сout<<"Изучаю программирование" точка с запятой
Crudelis вне форума Ответить с цитированием
Старый 15.07.2010, 21:21   #5
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

Crudelis
У меня ваша программа после внесения указанных мной изменений работает без проблем (если не считать утечки памяти, из-за мусорного кода в конструкторе, который непонятно зачем выделяет память в хипе, которая затем нигде не освобождается). Пробовал запускать ее и в отладочном и в релизном варианте, результат один - нормальная работа. Таким образом, я больше ничем не могу вам помочь, т.к. не могу воспроизвести возникающую у вас ошибку. Могу только порекомендовать, проследить в отладчике когда и где портится адрес находящийся на момент возникновения ошибки в указателе temp или temp -> mass.

З.Ы: Кстати, зачем вы связываете с каждым узлом списка массив из десяти элементов, а затем работаете с этими массивами так, как будто они состоят только из пяти элементов? Так и было задумано?

Последний раз редактировалось Oleg_SK; 15.07.2010 в 21:41.
Oleg_SK вне форума Ответить с цитированием
Старый 15.07.2010, 23:48   #6
Crudelis
Пользователь
 
Аватар для Crudelis
 
Регистрация: 05.04.2010
Сообщений: 56
По умолчанию

Oleg_SK, дело в том что это всего лишь кусок программы, вся остальная часть не суть важная, и составляет более 700 строк, я нашел ошибку, оказывается проблема была не в деструкторе, а другом методе класса, её я исправил, и уже доделал программу. На счёт выделения непонятной памяти спасибо за совет я просто не заметил его, убрал
сout<<"Изучаю программирование" точка с запятой
Crudelis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите найти ошибку в коде ( С++ ) nexUS1 Помощь студентам 1 29.12.2009 01:09
помогите найти ошибку в коде Saka Помощь студентам 6 07.12.2009 11:43
не могу найти ошибку в коде pavelstraut Общие вопросы C/C++ 5 24.07.2009 23:20
Помогите найти ошибку в коде Jora_Kornev Общие вопросы Delphi 10 10.01.2009 17:00
Памагите найти ошибку в коде...С++ Goblin Помощь студентам 1 13.05.2008 18:15