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

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

Если функция возвращает динамический массив... [D7, WinXP]


Jolik ©   (2005-10-20 09:11:00) 

Если функция возвращает динамический массив в качестве результат - создается ли его копия в памяти - или мы получаем ссылку на тот же массив? Т.е. ведет ли себя в этом случае динамический массив как string (я так понял - это близнецы-браться в Дельфи)?
Спасибо!


begin...end   (2005-10-25 08:24:00) [1]

> GuAV ©   (24.10.05 22:45) [9]

Ну, как переменная он может быть и не финализируется, но тело массива-результата в примере [6] освобождается. Если вручную не уменьшать счётчик, то не освободится, и именно потому, что счётчик больше нуля. Про такой случай я и говорил в [3].


TButton   (2005-10-25 02:55:00) [2]

по сабжу
если мне нужно, чтоб функция вернула динамический массив
я переделываю её в процедуру
например

type
 tMyArray = array of tSomeThing
...
procedure ReturnValues( var arr: tMyArray);
begin
 SetLength(arr,...
end;

это позволяет создать массив во внешней процедуре (функции)
передать его для наполнения/обработки
и уничтожить не знадумываясь
о том, куда девается память


GuAV   (2005-10-24 22:45:00) [3]


> Скомпилируй, запусти, удивись :)

Нашел чем удивить :)
Результат нефинализируется, финализируется переменная A.

Т.к. обе переменные ссылаются на один и тот же массив, правка счётчика ссылок приводит к тому что финализация предпоследней, а не последней переменной приводит к удалению массива из памяти.

Т.е., для массива как для структуры в памяти счётчик ссылок может менятся, однако массив как переменная (т.е. параметр Result) не финализируется и не инициализируется в вызываемой подпрограмме.

Я подумал, что ты говоришь про переменную, потому, что термин "финализация" применим к именно переменной, а не к структуре в памяти.


Anatoly Podgoretsky   (2005-10-24 09:03:00) [4]

Я к тому,

function Foo: TArrayType;
begin
  BlackBox;
end;


Anatoly Podgoretsky   (2005-10-24 08:54:00) [5]

Автор не говорит точно об функции, что у него именно и как он работает с этим. Отсюда два толкования. Если строго следовать вопросу, то ни о каких локальных переменных и присвоении их результату и речи быть не должно.


begin...end   (2005-10-24 08:44:00) [6]

> GuAV ©   (21.10.05 12:29) [4]

> Функция, возвращающая динамический массив эквивалентна процедуре
> имеющей дин. массив в качестве var параметра.

Это понятно, но я говорил про случай, когда внутри функции есть локальная переменная динамического массива, и её значение присваивается Result'у. Посмотри на вопрос -- если имелось в виду не это, то причём тут тогда копия в памяти? По-моему, вопрос был как раз в том, будет ли при таком присваивании копирование массива или нет.

> не предпринимается никаких попыток финализировать его там

Ой.

type
 TStrArray = array of string;

function GetArray: TStrArray;
var
 A: TStrArray;
begin
 SetLength(A, 1);
 A[0] := 'abcdef';
 Result := A;
 Dec(PInteger(Cardinal(A) - 8)^)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage(GetArray[0])
end


Скомпилируй, запусти, удивись :)


evvcom   (2005-10-21 13:00:00) [7]

И как это в функции результат может инициализироваться в вызывающей программе? Я про случай, когда функция возвращает не ссылку на уже существующий массив (приватное поле или глобальная переменная), а когда делается именно в этой функции SetLength(Result, Value);


GuAV   (2005-10-21 12:29:00) [8]


> Просто на единицу увеличивается счётчик ссылок массива
> -- поэтому он и не финализируется автоматически перед
> выходом из подпрограммы.


Нет, не поэтому, а потому что не предпринимается никаких попыток финализировать его там.

Функция, возвращающая динамический массив эквивалентна процедуре имеющей дин. массив в качестве var параметра. Т.е. дин массив инициализируется и финализируется в вызывающей, а не в вызываемой подпрограмме.


begin...end   (2005-10-20 10:03:00) [9]

> Jolik ©   (20.10.05 09:11)

> создается ли его копия в памяти

Нет.

> или мы получаем ссылку на тот же массив?

Да.

Просто на единицу увеличивается счётчик ссылок массива -- поэтому он и не финализируется автоматически перед выходом из подпрограммы.


TUser   (2005-10-20 10:01:00) [10]

Если ты внутри функции сделал SetLength (result,125), то в этот момент создается его экземпляр в памяти (нужной длины), но он не уничтожается после завершения работы ф-ции. Наоборот, ссылка на этот экземпляр возвращается твоей функцией.


umbra   (2005-10-20 09:59:00) [11]

не совсем понятно, о чем речь. Копия чего создается (или нет) в памяти?


Наверх

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