Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-19472
саша
2003-03-19 13:29
2003.04.07
Событе у Table


7-19878
Алексей Глеб
2003-02-11 14:28
2003.04.07
Импульсы


1-19607
Danger
2003-03-27 01:10
2003.04.07
Как определить ItemIndex предыдущего элемента сombobox???


4-19933
qq
2003-02-07 18:12
2003.04.07
Список логинов


14-19836
uw
2003-03-19 17:50
2003.04.07
OSR2





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский