Форум: "Основная";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
Внизосвобождение памяти Найти похожие ветки
← →
lena19 (2004-06-26 16:19) [0]function TForm1.listcreate(s:string;width:integer):Tstringlist;
var s1:string;
n:integer;
begin
result:=tstringlist.create;
end;
произойдет ли освобождение памяти(result) при выходе из этой функции ??
← →
Sir John © (2004-06-26 16:28) [1]если Вы желаете узнать, останется ли жив объект после выхода из функции - да, останется.
Только непнятно, для чего Вы передаете параметры в функцию?
В дополнении Вам необходимо будет уничтожить объект при выходе из программы.
Кстати, мой Вам совет. Передавайте строковые переменные в функцию как константы. Т. е. вот так
function TForm1.listcreate(cosnt s:string;width:integer):Tstringlist;
← →
KSergey © (2004-06-26 16:31) [2]Нет
Вернее так: из под переменной result память, конечно высвободится, а вот созданный экземпляр объекта tstringlist - безусловно останется.
Остается не потерять на него ссылку и после уничтожить.
← →
KSergey © (2004-06-26 16:35) [3]> Sir John © (26.06.04 16:28) [1]
> Кстати, мой Вам совет. Передавайте строковые переменные
> в функцию как константы. Т. е. вот так
Ну, не всегда это допустимо, верно? ;)
Вы, вероятно, заботитесь об отсутсвии создния дополнительного экземпляра строки при вызове функции, верно?
Вообще, это вроде как правильно.
Вот только есть у меня воспоминание, что в этом случае все равно передасться ссылка на строку, и только если она изменятеся внутри ф-ции - только в этот момент создается дополнительный экземпляр строки.
← →
GuAV © (2004-06-26 16:40) [4]В хелпе raise->Re-raising exceptions, там почти этот пример.
← →
Sir John © (2004-06-26 17:12) [5]Ответ: KSergey
Вот только есть у меня воспоминание, что в этом случае все равно передасться ссылка на строку, и только если она изменятеся внутри ф-ции - только в этот момент создается дополнительный экземпляр строки.
т. е. Вы хотите сказать, что внутри функции или процедуры я смогу изменить данные передаваемой строки как константы?
Т. е. Вы утверждаете, что этот код будет рабочим?
function TForm1.GetConstString(const s: String): String;
begin
s := "AABS";
Result := S;
end;
← →
default © (2004-06-26 17:17) [6]Sir John © (26.06.04 17:12) [5]
я смогу изменить данные передаваемой строки как константы?
конечно
← →
Sir John © (2004-06-26 17:36) [7]сорри, ошибка. Не данные строки, а изменить параметр, передаваемый как константа
← →
default © (2004-06-26 17:38) [8]всмысле?параметр не данные?
← →
Тимохов © (2004-06-26 18:13) [9]
> Sir John © (26.06.04 17:12) [5]
ваш пример просто не скомпилится
← →
lena19 (2004-06-26 18:32) [10]получается что при очень частом вызове такой вункции потребности в памяти будут расти и в конце концов
прога висанет
← →
GuAV © (2004-06-26 19:04) [11]Не обязательно
for i:=0 to 9999 do listcreate("1111",2).Free;
← →
lena19 (2004-06-26 20:40) [12]To GuAV
что то я не поняла как в этом случаее получить значения
возвращаемые функцией ?
← →
Anatoly Podgoretsky © (2004-06-26 20:43) [13]Оно здесь в точке
← →
GuAV © (2004-06-26 21:04) [14]
var list: TStrings;
begin
list:=listcreate("1111",2);
try
// работаем со списком
finally
list.free;
end;
end;
или так
begin
with listcreate("1111",2) do
try
// работаем со списком
finally
free;
end;
end;
Создание списка:function TForm1.listcreate(cosnt s:string;width:integer):Tstringlist;
var
...
begin
Result := TStringList.Create;
try
// Здесь Ваш код
except
Result.Free;
raise;
end;
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.032 c