![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли так обращаться с памятью?
Eli © (2004-08-26 12:30:00)Допустимо ли создавать такую функцию, или всякий раз подобное действие будет приводить к потере памяти? Ведь внутри тела функции я не могу использовать free
function MyStringList(St:String):TStringList;
begin
Result:=TStringList.Create;
//....
end;
Amoeba (2004-08-26 13:18:00) [1]
> Задумано было использовать как у Сорокина, но опасался потерь
> памяти после тысяч обращений в цикле.
Если будешь делать так, как тебе сказали (см. мой первый пост и пример Сорокина), то никаких утечек памяти не будет.
LMD
Amoeba (2004-08-26 13:15:00) [2]
> Анонимщик © (26.08.04 13:11) [13]
Причем здесь MSDN? Это относится базовым принципам программирования, поскольку в Pascal есть разница между процедурами и ф-ями.
Так что это Вы начинаете городить ерунду.
LMD
Анонимщик (2004-08-26 13:14:00) [3]Ну и разбирайтесь нахер сами
Eli (2004-08-26 13:12:00) [4]>>Но так как тебе резултьтат выполнения функции нужен, то этого
>>делать не нужно. Другое дело, что ты и эту функцию используешь >>таким боком, что кривее и не придумать.
Да ладно, это только для примера.
Задумано было использовать как у Сорокина, но опасался потерь памяти после тысяч обращений в цикле.
Анонимщик (2004-08-26 13:11:00) [5]Amoeba ©
Должно или не должно - личное дело автора функции. В MSDN написано, что не должно? Нет? Вот и не городи лишнего.
Amoeba (2004-08-26 13:10:00) [6]
> Анонимщик © (26.08.04 13:08) [11]
Правильно! На хрена нужна такая ф-я, если она всегда будет возвращать nil или чер-те-что.
Анонимщик (2004-08-26 13:08:00) [7]Гаврила
Вернет nil, какие вопросы?
Eli
Не FreeAnNil, а FreeAndNil.
Но так как тебе резултьтат выполнения функции нужен, то этого делать не нужно. Другое дело, что ты и эту функцию используешь таким боком, что кривее и не придумать.
Amoeba (2004-08-26 13:01:00) [8]Господа, что за глупости вы городите!
Никаких Result.Free в ф-ии не должно быть! Правильно у
> Семен Сорокин © (26.08.04 12:43) [3]
Eli (2004-08-26 12:58:00) [9]procedure TForm1.Button1Click(Sender: TObject);
function MyStringList(St:String):TStringList;
begin
Result:=TStringList.Create;
Result.Text:=St;
FreeAnNil(Result);
end;
begin
Caption:=MyStringList('Áëà-áëà-áëà').Text;
end;
[Error] Unit1.pas(31): Undeclared identifier: 'FreeAnNil'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
Вот так!
Так работает:
procedure TForm1.Button1Click(Sender: TObject);
function MyStringList(St:String):TStringList;
begin
Result:=TStringList.Create;
Result.Text:=St;
//Result.Free;
end;
begin
Caption:=MyStringList('Áëà-áëà-áëà').Text;
end;
Гаврила (2004-08-26 12:57:00) [10]
> Анонимщик © (26.08.04 12:46) [4]
> Во-первых, "бла-бла-бла" - это что?
> А во-вторых, почему это ты не можешь писать
>
> function MyStringList(St:String):TStringList;
> begin
> Result:=TStringList.Create;
> //....
> Result.Free; // лучше FreeAnNil(Result);
> end;
Ну и что вернется результатом функции ???
Анонимщик (2004-08-26 12:52:00) [11]Что не так? Поверяй на nil в таком случае. А чтобы и прямо, и криво - то нельзя.
Eli (2004-08-26 12:51:00) [12]function MyStringList(St:String):TStringList;
begin
Result:=TStringList.Create;
//....
Result.Free; // лучше FreeAnNil(Result);
end;
Потому что потом к этой функции не обратиться в программе...
Eli (2004-08-26 12:47:00) [13]То есть, можно!
Об этом и спрашивал...
Анонимщик (2004-08-26 12:46:00) [14]Во-первых, "бла-бла-бла" - это что?
А во-вторых, почему это ты не можешь писать
function MyStringList(St:String):TStringList;
begin
Result:=TStringList.Create;
//....
Result.Free; // лучше FreeAnNil(Result);
end;
Возьми да напиши, если приспичило.
Семен Сорокин (2004-08-26 12:43:00) [15]
> Eli (26.08.04 12:39) [2]
> Так что ли?
неа не так, а вот так:
function MyStringList(St:String):TStringList;
begin
Result:=TStringList.Create;
//....
end;
var
_sl: TStringList;
begin
_sl := MyStringList('бла-бла-бла');
....
_sl.Free
end;
Eli (2004-08-26 12:39:00) [16]Так что ли?
function MyStringList(St:String):TStringList;
var MyVar:TStringList;
begin
MyVar:=TStringList.Create;
Result:=MyVar;
MyVar.Free;
// есть ли смысл у этого странного действия?
end;
Amoeba (2004-08-26 12:35:00) [17]Разумеется допустимо. Но значение ф-ии обязательно должно присваиваться некой переменной данного типа. И уже у нее вызывать Free.