Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.039 c
1-1093528640
Age
2004-08-26 17:57
2004.09.12
Блокировка печати в QReport


1-1093445756
RaPtoR_1
2004-08-25 18:55
2004.09.12
архивация стандартными средствами виндоус


3-1092632990
Mamed
2004-08-16 09:09
2004.09.12
Bag v AdODB i WebBrowser


6-1089138129
SergP
2004-07-06 22:22
2004.09.12
UDP. Как отослать пакет на диапазон адресов?


14-1093508032
YurikGL
2004-08-26 12:13
2004.09.12
Кибертерроризм или бред Касперского





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