Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.07;
Скачать: CL | DM;

Вниз

Можно ли использовать такую функцию:   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.017 c
3-19505
ant
2003-03-20 02:52
2003.04.07
Подскажите в D5 под Win2000, XP. ошибка EOF BOF


7-19895
Герасимов
2003-02-06 23:04
2003.04.07
ShutDoun в win 2000


1-19597
Shumov D.
2003-03-28 17:16
2003.04.07
OpenDialog


4-19920
xZero
2003-02-09 00:15
2003.04.07
PE


1-19620
апельсин==
2003-03-25 13:45
2003.04.07
подскажите как определить код символа табуляции в тексте