![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Free дерева
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.