Форум: "Основная";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];
ВнизМожно ли использовать такую функцию: Найти похожие ветки
← →
MAN-In-RED (2003-03-25 22:10) [0]
function Test: TStringList;
begin
Result := TStringList.Create;
Result.Clear;
Result.Add("!");
end;
Понятно, она работает, но будет ли утечка памяти после выполнения такой функции, ведь кодResult.Free
уничтожит ее результат.
Что тут делать?
← →
Palladin (2003-03-25 22:59) [1]зделаешь
MySList:=Test;
а потом
MySList.free;
утечки не будет...
но мне интересно почему именно такая конструкция?
разве нельзя
procedure Test(p_SL:TStringList);
begin
p_SL.Clear;
p_SL.Add("!");
end;
← →
MAN-In-RED (2003-03-25 23:25) [2]
> Palladin © (25.03.03 22:59)
> зделаешь
>
> MySList:=Test;
> а потом
> MySList.free;
Не понял, это как?
> утечки не будет...
Если не будет, значит оставим, но что-то мне кажется тут не хорошо...
> но мне интересно почему именно такая конструкция?
> разве нельзя
> procedure Test(p_SL:TStringList);
> begin
> p_SL.Clear;
> p_SL.Add("!");
> end;
Нет.
← →
Palladin (2003-03-25 23:30) [3]объясняю
твоя функция возвращает указатель на объект TStringList, естественно если ты его не запомнишь в какую нибудь переменную то он канет в лету и состоится утечка памяти, соответсвенно учитывая вышеизложеное мы можем провернуть в твоем случае данное:
function CreateAndAddChar:TStringList;
begin
result:=TStringList.Create;
result.Add("!");
end;
var
MyStringList:TStringList;
begin
MyStringList:=CreateAndAddChar;
...
//тут мы сним работает
...
//все поработали, пора освообождать
MyStringList.Free;
end;
чего тут непонятного?
и почемуже всетаки нельзя использовать другую конструкцию, всегда можно использовать что то другое... но причины ты не привел...
← →
MAN-In-RED (2003-03-25 23:42) [4]Все, понял, спасибо…
← →
Юрий Зотов (2003-03-25 23:49) [5]> MAN-In-RED © (25.03.03 22:10)
Использовать такую функцию можно, и даже не обязательно запоминать ссылку на нее:
with CreateAndAddChar do
try
...
finally
Free
end;
Только такие функции - это ОЧЕНЬ дурной тон. Потому что рано или поздно кто-то незнакомый с ее устройством ОБЯЗАТЕЛЬНО упустит уничтожение объекта - и здравствуй, утечка памяти. Поэтому гораздо надежнее передавать в функцию ссылку на уже созданный внешний объект, а в самой функции только его заполнять. И, честно говоря, я не вижу против этого никаких аргументов. Поскольку простое "нет" - это не аргумент.
P.S.
Clear сразу после Create - зачем? Чистить-то еще нечего.
← →
Palladin (2003-03-26 01:10) [6]
> ОЧЕНЬ дурной тон
эт точно...
имхо:
можно использовать и with, но лично мне он не нравится из-за возможной небольшой путанницы с чтением кода...
когда есть два одноименных метода... у объекта в with и у класса с описываемым методом...
например
TMyClass1=class
procedure Method1;
end;
TMyClass2=class
procedyre Method1;
end;
procedyre TMyClass1.Method1;
begin
with CreateMyClass2 do
try
Method1;
finally
free;
end;
end;
в приведенном примере конечно понятно чей же метод вызывается, но при нагруженом коде иногда можно и запутаться, в общем себе дороже...
я понимаю self.Method1 и пр...
но все же человеческий фактор :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c