Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Free дерева


Страницы:   1 2

KADAN ©   (2004-07-22 16:37:00) 

мне нужно очистить память, выделенную под дерево. думал, что просто будет сделать так:
procedure FreeTree(var T: PTree);
begin
 case T^.NodeType of
   ntType1:
     begin
       FreeTree(T^.Left);
       FreeTree(T^.Right);
     end;
   ntType2:
     FreeTree(T^.Center);
 end;
 dispose(T);
end;

оказалось, так делать нельзя... как проверить, выделена ли память под ветви, а то поятоянно выскакивают AV и IPO.
само дерево выглядит так:

type  
 PTree = ^TTree;
 TTree = record
   case NodeType:TNodeType of
   ntType1:
     (Left, Right: PTree);
   ntType2:
     (Center: PTree);
   ntType3:
     ();
 end;


вообще, это дерево у меня - результат выполнения рекурсивной функции... мне бы хотелось, чтобы при возникновении ошибки эта функция сама бы очистила уже выделенную память и вернула nil.


VMcL   (2004-07-22 21:40:00) [1]

>>Sandman25 ©  (22.07.04 17:35) [24]

Значит, я плохой сын :)


Sandman25   (2004-07-22 17:35:00) [2]

>ИМХО, рефакторинг не должен ухудшать быстродействие

Рефакторингу глубоко наплевать на быстродейтвие. Все "отцы-основатели" прямо об этом пишут в самом начале своих лекциях.


VMcL   (2004-07-22 17:32:00) [3]

>>Sandman25 ©  (22.07.04 17:23) [22]

ИМХО, рефакторинг не должен ухудшать быстродействие. И с каких это пор FillChar нечитабельной стала? Ну да ладно. Это не принципиальный вопрос.


Sandman25   (2004-07-22 17:23:00) [4]

[20] VMcL ©   (22.07.04 17:20)

C точки зрения скорости - да.
С точки зрения читабельности/структурности - нет.

Если процедура вызывается с одними и теми же параметрами, то следует завести новую процедуру с уменьшенным количеством параметров. Рефакторингом называется :)


Sandman25   (2004-07-22 17:20:00) [5]

И еще книжку почитать, про инициализацию динамических структур :)


VMcL   (2004-07-22 17:20:00) [6]

>>Sandman25 ©  (22.07.04 17:18) [17]

+ лучше FillChar, а не ZeroMemory.


ИдиотЪ   (2004-07-22 17:19:00) [7]

чего намудрили-то?
зачем чего-то освобождать, если оно nil ?
поставь проверку перед вызовом функции и не мучай себя и других


KADAN   (2004-07-22 17:19:00) [8]

ZeroMemory... отлично! наверное это мне и надо было...


Sandman25   (2004-07-22 17:18:00) [9]

или лучше
ZeroMemory(Result^, SizeOf(Result^));


Sandman25   (2004-07-22 17:16:00) [10]

new(result);
ZeroMemory(result^, SizeOf(TTree));
...
и теперь неиспользуемые поля будут nil


KADAN   (2004-07-22 17:13:00) [11]

наверное, плохо объяснил систему...

function GetTree(параметры):PTree;
begin
try
 new(result); //после этого right и left не nil... и бог знает куда они указывают
 result^.NodeType:=ntType1;
 result^.left:=GetTree(новыепараметры1);
 result^.right:=GetTree(новыепараметры2);
except
 FreeTree(result);
end;
end;


допустим, при создании левой ветки выпал еррор, идем в FreeTree, правая ветка при этом указывает в никуда (но не в nil... например, в 0000001C), очистить мы ее не можем, и определить, что под не ничего не выделено тоже.


Sandman25   (2004-07-22 17:08:00) [12]

>(она теперь указывет в никуда)

Что Вы под этим понимаете?


KADAN   (2004-07-22 17:05:00) [13]


> Вот и я о том же. Вы вызываете FreeTree(T^.Right) и при
> этом происходит вызов FreeTree с новым параметром T, равным
> nil. Вопрос - "Нужно ли освобождать память, если T=nil?"

я бы с радосьбю так сделал... тока вот nil'ов нету там...


Sandman25   (2004-07-22 17:03:00) [14]

Вот и я о том же. Вы вызываете FreeTree(T^.Right) и при этом происходит вызов FreeTree с новым параметром T, равным nil. Вопрос - "Нужно ли освобождать память, если T=nil?"


KADAN   (2004-07-22 17:01:00) [15]

T^.Right никуда не указывает, как же я ее буду освобождать?


Sandman25   (2004-07-22 16:59:00) [16]

>а правую не смог создать (она теперь указывет в никуда).

и после этого вызваете
FreeTree(T^.Right)


KADAN   (2004-07-22 16:56:00) [17]


> Sandman25 ©   (22.07.04 16:52) [8]

например, я создаю узел, задаю ему тип ntType1,
создаю левую ветку,
а правую не смог создать (она теперь указывет в никуда).
теперь требуется очистить это все, плюс ко всему очистить все до самого корня.


Sandman25   (2004-07-22 16:52:00) [18]

[6] KADAN ©   (22.07.04 16:51)

И куда же они указывают, если все дерево состоит всего из одного узла?


Iconka   (2004-07-22 16:52:00) [19]


> простите, недопонял...


шутка :)


KADAN   (2004-07-22 16:51:00) [20]

>Sandman25 ©   (22.07.04 16:49) [4]
после вызова метода New Left, Right и Center не nil.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо