-
Тут как бы надо знать устройство дельфового менеджера памяти на более высоком уровне, чем его знаю я. Поэтому спрошу в сюда. вот код:
function GetSomeList: TStringList;
begin
Result := TStringList.Create;
end; далее я вызываю данную функцию, например
SomeListBox.Items := GetSomeList; теперь результат работы функции GetSomeList надо как-то уничтожить. Если сделать GetSomeList.Free - функция выполняется два раза, а это не оптимально, да и порой неудобно. Каким образом лучше реализовать? То есть мне просто надо сделать функцию, возвращающую стринглист и чтобы без утечки памяти.
-
сделай процедуру, которой передаешь созданный TStringList, потом его уничтожаешь, когда нужно.
-
Procedure FillStringList(p_theSL:TStringList);
Begin
.. заполняем
End;
Var
theSL:TStringList;
Begin
theSL:=TStringList;
Try
FillStringList(theSL);
...
Finally
theSL.Free;
End;
End; это - правильно
-
зачем создавать TStringList для св-ва TStrings если оно уже создано и используется в объекте
Procedure FillStringList(p_theSL:TStrings); Begin .. заполняем End;
FillStringList(SomeListBox.Items);
-
> Palladin © (09.02.09 08:04) [2] > theSL:=TStringList;
theSL:=TStringList.Create; Я не смеюсь, мало ли, чего недопонял :)
-
:) никто не застрахован от описек и недописек :)
-
> korneley © (09.02.09 08:13) [4]
Это не чистый дельфи, это Palladin Delphi Extension ®
-
> Palladin © (09.02.09 08:04) [2]
идею понял. так и сделаю ибо проще. спасибо. а все таки интересно, как ведет себя менеджер памяти. Вот когда я делаю так: SomeListBox.Items := GetSomeList; в SomeListBox.Items передается указатель на стринглист созданный функцией GetSomeList. Если например сделать так:
var
TempList: TStringList;
begin
TempList := GetSomeList;
try
SomeListBox.Items := TempList;
finally
TempList.Free;
end;
end;
если в TempList передается указатель на стринглист, созданный функцией GetSomeList, то при выполнении строки TempList.Free этот самый стринглист должен умереть. Я прав?
-
> 123-ий © (09.02.09 09:27) [7]
> Я прав?
Угу.
-
> 123-ий © (09.02.09 09:27) [7]
Абсолютно, но функций создающих и возвращающих объект какого то класса, нужно по возможности избегать. Все дело в том, что в процессе создания и/или инициализации этого объекта может произойти исключение и, в следствии этого утечка памяти. Например Function CreateMyObj:TMyClass;
Begin
Result:=TMyClass.Create;
Result.Prop1:=Value1; End;
Var
obj:TMyClass;
Begin
obj:=CreateMyObj;
Try
...
Finally
obj.Free; End;
End;
-
> Palladin © (09.02.09 08:04) [2] > Procedure FillStringList(p_theSL:TStringList); > Begin > .. заполняем > End;
Тогда даже лучше Procedure FillStringList(p_theSL:TStrings); Тогда туда можно будет передавать в том числе и Items от SomeListBox и не придется создавать временный, а потом из него копировать.
-
Именно в [3], по этому поводу, я и исправился, более внимательней прочитав вопрос )
-
> Palladin © (09.02.09 09:43) [11]
а, точно, не заметил, сорри.
-
А почему вопрос задан в потрепаться, а не в тематической?? вполне себе тематический вопрос, по-моему.
-
> Palladin (09.02.2009 9:41:09) [9]
Это можно легко исправить, немного переделав функцию, но смысла нет.
-
> KSergey © (09.02.09 09:45) [13]
на всякий случай. туда предпочитаю не лазить почему то. :)
> Anatoly Podgoretsky © (09.02.09 09:51) [14]
смысла то нет, а все тки расскажите. =) интересно
-
KSergey © (09.02.09 09:45) [13] Тут мастеров больше ))
-
> 123-ий © (09.02.09 10:03) [15] > смысла то нет, а все тки расскажите. =) интересно
А самому подумать? как подсказка - try/except
-
А я вот немного не пойму, пример в [0] был тестовый или взятый из "реальной жизни"? Просто зачем создавать промежуточный TStringList если он уже создан в SomeListBox? Может проще брать его оттуда и использовать? Зачем лишние затраты на создание класса и вызов Assign-а при присвоении?
-
> [0] 123-ий © (09.02.09 07:42) > GetSomeList.Free - функция выполняется два раза, а это не оптимально, да и порой неудобно.
Более того.... Неправильно, ибо память, выделенная в первом вызове, так и утекет в никуда....
|