Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли так обращаться с памятью?


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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо