Главная страница
    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.009 c
7-19898
Димон
2003-02-13 21:14
2003.04.07
Как програмно изменять скорость сидюка???


1-19604
$Hic0
2003-03-28 17:57
2003.04.07
Access violation... :(((


14-19860
valmont
2003-03-21 17:20
2003.04.07
Формат файла AutoCad dwg


1-19670
I_one
2003-03-26 06:01
2003.04.07
Как можно получить всех потомков выбранного элемента TreeView..?


14-19867
Dim!S
2003-03-21 04:53
2003.04.07
Как заработать на программе





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский