Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / рекурсивная структура, деструктор + / 14 сообщений из 14, страница 1 из 1
26.01.2014, 14:04
    #38538200
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
рекурсивная структура, деструктор +
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
struct coor
{
	int x;
	int y;
	coor *next;
	coor ();
	
        coor (int x, int b);
	~coor ();
};

coor::coor ()
{
	this->next=0;
}
coor::coor (int x, int b)//: coor()
{
	this->x = x;
	y = b;
	this->next=0;
}
coor::~coor ()
{
	cerr<<"\nIt is DESTRUCTOR";
       	if (next)
        	delete next;
}



я деструктор правильно написал?

меня смущает, что деструктор, по видимому, рекурсивно вызывается.
А если будет миллион структур, там стека хватит?
...
Рейтинг: 0 / 0
26.01.2014, 14:06
    #38538201
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
рекурсивная структура, деструктор +
может тело деструктора в хедер переложить, там он встраиваемый будет
...
Рейтинг: 0 / 0
26.01.2014, 14:24
    #38538214
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
рекурсивная структура, деструктор +
tchingizтам он встраиваемый будет

Во-первых, не факт.
Во-вторых, от рекурсии это не избавит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.01.2014, 16:18
    #38538295
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
рекурсивная структура, деструктор +
tchingiz,

Это проблема дизайна.
У вас есть класс только для сущности "узел списка".
А должен быть еще класс для самого списка, с указателем на голову списка.

В классе "список" создать функцию очистки списка clear(), в которой просто в цикле (без рекурсии) пройти по всем узлам, удалять их из списка, обнулять поле next и потом уже удалять объект.
А в деструкторе "списка" просто вызвать clear().

Вообще по большому счету деструктор "узла" не должен рекурсивно удалять ничего, даже если есть следующий узел. Все удаления и прочие модификации списка нужно делать функциями "списка".
...
Рейтинг: 0 / 0
27.01.2014, 14:50
    #38539075
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
рекурсивная структура, деструктор +
ок.
290 000 структур удалось создать и удалить.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
is ctor for 292057
It is ctor for 292058
It is ctor for 292059
It is DESTRUCTOR
It is DESTRUCTOR
It is DESTRUCTOR
It is DESTRUCTOR
It is DESTRUCTOR
It is DESTRUCTOR
...
Рейтинг: 0 / 0
27.01.2014, 14:51
    #38539077
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
рекурсивная структура, деструктор +
оффтопик
правда вчера во время выполнения приложения сгорел блок питания
:))
...
Рейтинг: 0 / 0
27.01.2014, 15:28
    #38539153
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
рекурсивная структура, деструктор +
tchingizоффтопик
правда вчера во время выполнения приложения сгорел блок питания
:))

... что как бэ намекает ...
...
Рейтинг: 0 / 0
27.01.2014, 20:50
    #38539696
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
рекурсивная структура, деструктор +
дада
почитать главу Абстрактные типы данных Бертрана Мейера, там стек проектируется.
Получится как Anatoly Moskovsky советует
...
Рейтинг: 0 / 0
27.01.2014, 21:50
    #38539716
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
рекурсивная структура, деструктор +
tchingiz,

Если не хотите заморачиваться с доп. классом, то ничего не мешает в деструкторе узла НЕрекурсивно пройтись по всем следующим узлам и удалить каждый предварительно очистив поле next.
Только все равно это подпорка, и прорвет где-нибудь в другом месте, где вы забудете про устранение рекурсии :)
...
Рейтинг: 0 / 0
29.01.2014, 16:22
    #38542345
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
рекурсивная структура, деструктор +
Anatoly Moskovsky,
ок
1
да, заморочусь с доп классом, не вопрос. И понятно почему надо заморочиться.

2
пройтись не рекурсивно тоже понятно, я так и делал до рекурсии деструктора


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
coor::coor ()
{
        cerr<<"\nIt is ctor for "<< count++;
        count++;
	this->next=0;
}
coor::coor (int x, int b)//: coor()
{
        cerr<<"\nIt is ctor for "<< count++;
	this->x = x;
	y = b;
	this->next=0;
}

#ifdef USERECURSION
      coor::~coor ()
      {
           // cerr<<"\nIt is DESTRUCTOR for "<< count--;
            if (next)
              delete next;
      }
#else

coor* freeArr (coor *tail)
{

	coor *head=0;
	while (tail)
	{
	     head = tail;
	     tail = tail->next;
	     delete head;
	}
	return 0;
}




непонятно как записать, что
Код: plaintext
1.
coor* freeArr (coor *tail) 

деструктор?
Деструтор в делете хеад вызовется и тоже начнет цикл, который вызовет деструктор
...
Рейтинг: 0 / 0
29.01.2014, 16:24
    #38542352
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
рекурсивная структура, деструктор +
free(void * memblock) же вызвать не правильно?
...
Рейтинг: 0 / 0
29.01.2014, 21:09
    #38542787
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
рекурсивная структура, деструктор +
tchingiz,

Что-то типа этого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
      coor::~coor ()
      {
            coor* n = next;
            while (n) {
              coor* tmp = n;
              n = n->next;
              tmp->next = 0;
              delete tmp;
            }
      }
...
Рейтинг: 0 / 0
29.01.2014, 23:58
    #38542927
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
рекурсивная структура, деструктор +
Anatoly Moskovsky,
от блин

три дня назад я с этого начал. только не вставил
выделенную строку.
Код: plaintext
1.
2.
3.
4.
5.
6.
 while (n) {
              coor* tmp = n;
              n = n->next;
  ------>            tmp->next = 0;  <--------------------------------------------------
              delete tmp;
            }



анивей сенкс
...
Рейтинг: 0 / 0
30.01.2014, 00:01
    #38542933
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
рекурсивная структура, деструктор +
исключительно для отчета
tchingiz[
меня смущает, что деструктор, по видимому, рекурсивно вызывается.
А если будет миллион структур, там стека хватит?
при 19000 структур пропал стдерр
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / рекурсивная структура, деструктор + / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]