powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / рекурсивная структура, деструктор +
14 сообщений из 14, страница 1 из 1
рекурсивная структура, деструктор +
    #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
рекурсивная структура, деструктор +
    #38538201
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может тело деструктора в хедер переложить, там он встраиваемый будет
...
Рейтинг: 0 / 0
рекурсивная структура, деструктор +
    #38538214
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizтам он встраиваемый будет

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

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

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

Вообще по большому счету деструктор "узла" не должен рекурсивно удалять ничего, даже если есть следующий узел. Все удаления и прочие модификации списка нужно делать функциями "списка".
...
Рейтинг: 0 / 0
рекурсивная структура, деструктор +
    #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
рекурсивная структура, деструктор +
    #38539077
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оффтопик
правда вчера во время выполнения приложения сгорел блок питания
:))
...
Рейтинг: 0 / 0
рекурсивная структура, деструктор +
    #38539153
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizоффтопик
правда вчера во время выполнения приложения сгорел блок питания
:))

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

Если не хотите заморачиваться с доп. классом, то ничего не мешает в деструкторе узла НЕрекурсивно пройтись по всем следующим узлам и удалить каждый предварительно очистив поле next.
Только все равно это подпорка, и прорвет где-нибудь в другом месте, где вы забудете про устранение рекурсии :)
...
Рейтинг: 0 / 0
рекурсивная структура, деструктор +
    #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
рекурсивная структура, деструктор +
    #38542352
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
free(void * memblock) же вызвать не правильно?
...
Рейтинг: 0 / 0
рекурсивная структура, деструктор +
    #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
рекурсивная структура, деструктор +
    #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
рекурсивная структура, деструктор +
    #38542933
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
исключительно для отчета
tchingiz[
меня смущает, что деструктор, по видимому, рекурсивно вызывается.
А если будет миллион структур, там стека хватит?
при 19000 структур пропал стдерр
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / рекурсивная структура, деструктор +
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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