Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Внизкак правильно очистить TList ы, чтобы не было утечек памяти Найти похожие ветки
← →
__QWERTY (2012-05-04 14:28) [0]
var
I: Integer;
ListA, ListB: TList;
SL: TStringList;
begin
ListA := nil;
ListB := nil;
try
ListA := TList.Create;
ListB := TList.Create;
SL := TStringList.Create;
ListA.Add(SL);
for I := 1 to 10 do
begin
SL := TStringList.Create;
ListA.Add(SL);
ListB.Add(SL);
end;
except
ListA.Free;
ListB.Free;
end;
end;
← →
Медвежонок Пятачок © (2012-05-04 14:32) [1]а типа ты не знаешь
← →
MsGuns © (2012-05-04 14:59) [2]1)
ListA := nil;
ListB := nil;
И нафих не нужны
2) Вместо Except в данном случае нужен finally
3) а стиринглисты Пушкин с Байроном выгребут ?
← →
MsGuns © (2012-05-04 15:01) [3]Да и вообще в сабже бред написан, бессмыслица
← →
MBo © (2012-05-04 15:41) [4]for i := 0 to ListA.Count - 1 do
TObject(ListA[i]).Free;
А вообще в данном случае проще TObjectList c OwnObjects использовать
← →
icWasya © (2012-05-04 16:49) [5]Но! Если делаете так
SL := TStringList.Create;
ListA.Add(SL);
ListB.Add(SL);
то есть заносите один объект сразу в два списка - то вызывать деструктор(Free) нужно только один раз.
← →
CRLF (2012-05-04 16:54) [6]
> А вообще в данном случае проще TObjectList c OwnObjects
> использовать
Только рискуем нарваться на то, что в списке А объекты уже уничтожились, а в списке Б ссылки на них всё ещё живут.
← →
MBo © (2012-05-04 17:36) [7]Угу, не обратил внимания, что одни объекты в двух списках
← →
Ega23 © (2012-05-04 17:55) [8]Написать потомка TList, перекрыть ему Notify, там FreeAndNil дел
ааа, у него один и тот же объект.. Не получится. Либо третий ObjectList держать, в котором всё сидит, либо через интерфейсы разруливать
← →
Cobalt © (2012-05-04 19:27) [9]> MBo © (04.05.12 15:41) [4]
>for i := 0 to ListA.Count - 1 do
>TObject(ListA[i]).Free;
+1
← →
Rouse_ © (2012-05-04 20:48) [10]после FreeAndNil нет смысла заботиться проверкой уничтожен объект или нет.
Free сам проверит на nil
← →
Ega23 © (2012-05-04 21:41) [11]
> после FreeAndNil нет смысла заботиться проверкой уничтожен
> объект или нет.
Сань, он один и тот же объект в два разных листа добавляет. Ну FreeAndNil в первом, во втором-то указатель инвалидный остался...
← →
Германн © (2012-05-04 22:13) [12]
> во втором-то указатель инвалидный остался...
FreeAndNil во втором тоже нормально отработает.
← →
CRLF (2012-05-04 22:30) [13]
> Германн © (04.05.12 22:13) [12]
Он-то отработает... Но если вместо FreeAndNil с оббъектами из второго списка попытаемся работать? Последствия непредсказуемые.
← →
Германн © (2012-05-04 22:43) [14]
> Но если вместо FreeAndNil с оббъектами из второго списка
> попытаемся работать?
А это уже будет другой пример.
← →
Ega23 © (2012-05-05 09:16) [15]
> FreeAndNil во втором тоже нормально отработает.
Да ну?
procedure TForm18.Button1Click(Sender: TObject);
var
list1, list2: TList;
sl: TStringList;
i: Integer;
begin
list1 := TList.Create;
list2 := TList.Create;
try
sl := TStringList.Create;
sl.Text := "sasorugoidfgpijp"#13#10"sdfjsoidfosiugfoiudbhsg";
list1.Add(sl);
list2.Add(sl);
for i := 0 to list1.Count - 1 do
begin
sl := TStringList(list1[i]);
FreeAndNil(sl);
end;
for i := 0 to list2.Count - 1 do
begin
sl := TStringList(list2[i]);
FreeAndNil(sl);
end;
finally
list2.Free;
list1.Free;
end;
end;
Invalid pointer operation, что вообще-та ожидаемо.
← →
icWasya © (2012-05-05 09:47) [16]Если нужно иметь именно такие списки, то есть несколько списков с произвольным добавлением/удалением, и нужно вести автоматический их учёт, то...
1) делать по технологии COM - объекты ведут учёт количества ссылок на них, и при обнулении количества ссылок автоматически вызывать деструктор.
2) делать по технологии компонент - при вызове деструктора объекта слать всем спискам уведомление, что объект уничтожился, и списки при этом должны удалить ссылку на уничтоженый объект.
3) вести полуавтоматический учёт - только один список является владельцем объектов, и при удалении из этого списка у объекта вызывается деструктор. А все остальные списки содержат только ссылки на объекты и не следят за временем их жизни. Естественно чистку первого списка делать только по окончании работы.
← →
AV © (2012-05-05 11:41) [17]а-ля так
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
begin
ListA := TList.Create;
ListB := TList.Create;
SL := TStringList.Create;
ListA.Add(SL);
for I := 1 to 2 do
begin
SL := TStringList.Create;
ListA.Add(SL);
ListB.Add(SL);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
procedure AddStringListToListForKill(SL:Pointer);
var
i: Integer;
Uniq: Boolean;
begin
Uniq := True;
for i := 0 to ListC.Count - 1 do
begin
if Pointer(ListC.Items[i]) = SL then
begin
Uniq := False;
Break;
end;
end;
if Uniq then
ListC.Add(TStringList(SL));
end;
procedure PrepareToFreeList(L: TList);
var
i: Integer;
begin
for i := 0 to L.Count - 1 do
begin
AddStringListToListForKill(Pointer(L.Items[i]));
end;
end;
begin
ListC := TList.Create;
PrepareToFreeList(ListA);
PrepareToFreeList(ListB);
for i := 0 to ListC.Count - 1 do
begin
TStringList(ListC.Items[i]).Free;
end;
end;
← →
Давайте будем жрать! (2012-05-05 12:12) [18]
> procedure AddStringListToListForKill(SL:Pointer);
Это зачем? Чем TList.IndexOf() не угодил?
> Pointer(L.Items[i])
А явное приведение типов зачем?
← →
AV © (2012-05-05 12:21) [19]>>Это зачем? Чем TList.IndexOf() не угодил?
>> А явное приведение типов зачем?
можно и IndexOf, можно и не приводить
Но мне так понятнее.
← →
Давайте будем жрать! (2012-05-05 12:28) [20]Понятно :-)
← →
MsGuns © (2012-05-07 10:47) [21]Огурец написал от балды чушь и тут же все надели "мудрое выражение ица" и принялись советовать.
Кое-кто предложил даже интерфейс сваять. Угу, а сбоку еще ком-сервер и уракакл впридачу.
Как это все по-мастаковски :)
← →
Inovet © (2012-05-07 15:07) [22]> [21] MsGuns © (07.05.12 10:47)
> Как это все по-мастаковски :)
Как вычистить глистов, типа?:)
← →
Давайте будем жрать! (2012-05-07 17:01) [23]
> все надели "мудрое выражение ица" и принялись советовать
Дык «Начинающим» не для просвещения начинающих существует, а для куражу бывалых. %-)
← →
Anatoly Podgoretsky © (2012-05-07 18:43) [24]
> MsGuns © (07.05.12 10:47) [21]
А веб сервер уже предлагали?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.072 c