Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.12;
Скачать: CL | DM;

Вниз

Можно ли так обращаться с памятью?   Найти похожие ветки 

 
Eli   (2004-08-26 12:30) [0]

Допустимо ли создавать такую функцию, или всякий раз подобное действие будет приводить к потере памяти? Ведь внутри тела функции я не могу использовать free

function MyStringList(St:String):TStringList;
begin
   Result:=TStringList.Create;
   //....

end;


 
Amoeba ©   (2004-08-26 12:35) [1]

Разумеется допустимо. Но значение ф-ии обязательно должно присваиваться некой переменной данного типа. И уже у нее вызывать Free.


 
Eli   (2004-08-26 12:39) [2]

Так что ли?

function MyStringList(St:String):TStringList;
var MyVar:TStringList;
begin
  MyVar:=TStringList.Create;
  Result:=MyVar;
  MyVar.Free;
  // есть ли смысл у этого странного действия?

end;


 
Семен Сорокин ©   (2004-08-26 12:43) [3]


> 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;


 
Анонимщик ©   (2004-08-26 12:46) [4]

Во-первых, "бла-бла-бла" - это что?
А во-вторых, почему это ты не можешь писать

function MyStringList(St:String):TStringList;
begin
  Result:=TStringList.Create;
  //....
  Result.Free; // лучше FreeAnNil(Result);
end;

Возьми да напиши, если приспичило.


 
Eli   (2004-08-26 12:47) [5]

То есть, можно!
Об этом и спрашивал...


 
Eli   (2004-08-26 12:51) [6]

function MyStringList(St:String):TStringList;
begin
 Result:=TStringList.Create;
 //....
 Result.Free; // лучше FreeAnNil(Result);
end;

Потому что потом к этой функции не обратиться в программе...


 
Анонимщик ©   (2004-08-26 12:52) [7]

Что не так? Поверяй на nil в таком случае. А чтобы и прямо, и криво - то нельзя.


 
Гаврила ©   (2004-08-26 12:57) [8]


> Анонимщик ©   (26.08.04 12:46) [4]
> Во-первых, "бла-бла-бла" - это что?
> А во-вторых, почему это ты не можешь писать
>
> function MyStringList(St:String):TStringList;
> begin
>   Result:=TStringList.Create;
>   //....
>   Result.Free; // лучше FreeAnNil(Result);
> end;


Ну и что вернется результатом функции ???


 
Eli   (2004-08-26 12:58) [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;


 
Amoeba ©   (2004-08-26 13:01) [10]

Господа, что за глупости вы городите!
Никаких Result.Free в ф-ии не должно быть! Правильно у

> Семен Сорокин ©   (26.08.04 12:43) [3]


 
Анонимщик ©   (2004-08-26 13:08) [11]

Гаврила
Вернет nil, какие вопросы?
Eli
Не FreeAnNil, а FreeAndNil.
Но так как тебе резултьтат выполнения функции нужен, то этого делать не нужно. Другое дело, что ты и эту функцию используешь таким боком, что кривее и не придумать.


 
Amoeba ©   (2004-08-26 13:10) [12]


> Анонимщик ©   (26.08.04 13:08) [11]

Правильно! На хрена нужна такая ф-я, если она всегда будет возвращать nil или чер-те-что.


 
Анонимщик ©   (2004-08-26 13:11) [13]

Amoeba ©
Должно или не должно - личное дело автора функции. В MSDN написано, что не должно? Нет? Вот и не городи лишнего.


 
Eli   (2004-08-26 13:12) [14]

>>Но так как тебе резултьтат выполнения функции нужен, то этого
>>делать не нужно. Другое дело, что ты и эту функцию используешь >>таким боком, что кривее и не придумать.

Да ладно, это только для примера.
Задумано было использовать как у Сорокина, но опасался потерь памяти после тысяч обращений в цикле.


 
Анонимщик ©   (2004-08-26 13:14) [15]

Ну и разбирайтесь нахер сами


 
Amoeba ©   (2004-08-26 13:15) [16]


> Анонимщик ©   (26.08.04 13:11) [13]

Причем здесь MSDN? Это относится базовым принципам программирования, поскольку в Pascal есть разница между процедурами и ф-ями.
Так что это Вы начинаете городить ерунду.

LMD


 
Amoeba ©   (2004-08-26 13:18) [17]


> Задумано было использовать как у Сорокина, но опасался потерь
> памяти после тысяч обращений в цикле.

Если будешь делать так, как тебе сказали (см. мой первый пост и пример Сорокина), то никаких утечек памяти не будет.
LMD



Страницы: 1 вся ветка

Текущий архив: 2004.09.12;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.04 c
1-1093840510
SNV-Soft
2004-08-30 08:35
2004.09.12
Как формат jpeg или gif преобразовать к формату bmp


14-1093101697
bender
2004-08-21 19:21
2004.09.12
Програмирование LPT порта


4-1090617944
кактусбел
2004-07-24 01:25
2004.09.12
Сканирование памяти


3-1092826456
Valera
2004-08-18 14:54
2004.09.12
Вопрос по DBGrid


1-1093426792
Sectey
2004-08-25 13:39
2004.09.12
Помогите разобраться с ошибкой Invalid variant type