Главная страница
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.013 c
1-19679
любитель
2003-03-26 09:29
2003.04.07
Помогите разобраться с указателем на массив...


1-19649
Мыш
2003-03-25 10:44
2003.04.07
рисование


3-19505
ant
2003-03-20 02:52
2003.04.07
Подскажите в D5 под Win2000, XP. ошибка EOF BOF


9-19402
Карлсон
2002-11-03 21:03
2003.04.07
NetWalk


6-19739
Sr_pr
2003-02-16 02:00
2003.04.07
Receive bytes (Winsock)