![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SetLength [D6, Win95/98]
skywalker © (2002-02-13 16:41:00)Народ, как работает SetLength?
ситуация:
type
TRec = record
somth:integer;
arr: array of byte;
end;
var
A:array of TRec;
B:array of TRec;
begin
SetLength(A,10);
...
SetLength(B,10);
for Counter:=0 to 9 do
B[Counter]:=A[Counter];
SetLength(A,0);.....
end;
Внимание вопрос, освободится ли при последнем SetLength(A,0)
память, на которую ссылается B? Если нет, то получается SetLength
не освобождает память и оставляет кучу мусора в оперативке?
Кто знает ответ, помогите!!
Макс Черных (2002-02-13 18:05:00) [1]2Виктор Щербаков
>Вот и освобождай каждый динамический массив вручную.
Это зачем? Есть ведь такая вещь как Finalize.
>skywalker ©
Настоятельно рекомендую посмотрель в help для чего нужна
процедура Finalize, и в модуле System.pas как она
реализована (_FinalizeArray- в частности).
Виктор Щербаков (2002-02-13 17:18:00) [2]
> А если динамическому массиву присваивать nil, то он освобождается?
Да освобождается.
> если допустим у меня в массиве есть воложенность
> н-ой степени, освободит ли SetLength() все указатели?
Нет. Вложенность - это ведь что-то вроде "массив указателей на массивы". Вот и освобождай каждый динамический массив вручную.
skywalker (2002-02-13 17:12:00) [3]Так как же с A и B?
если допустим у меня в массиве есть воложенность
н-ой степени, освободит ли SetLength() все указатели?
А если динамическому массиву присваивать nil, то он освобождается?
Я заметил такую фигню, особенно при работе с базами данных, что
прога со временем занимает все больше и болше памяти, явно мусорит. После перезагрузки системы у меня появляется лишних 20 мг оперативки!!!
McSimm (2002-02-13 17:04:00) [4]Строки это тоже указатели.
Если отследить приведенный мною код, можно будет увидеть, что после выполнения
B := A;
и B и A будут равны не только как строки, но и как указатели, т.е. ссылаться на одну и ту же область памяти.
Однако выполнение
A := "что-нибудь";
или
A[1] := "#";
представляет собой выделение новой памяти под A и последующее изменение. Поэтому изменение A не влечет за собой изменение B.
Виктор Щербаков (2002-02-13 16:59:00) [5]Элементы массивов в твоем случае не указатели, чего не скажешь о A и B из skywalker © (13.02.02 16:53).
Чтобы "access violation at memory read" не возникало используй
FreeAndNil:
FreeAndNil(A);
FreeAndNil(B);
skywalker (2002-02-13 16:53:00) [6]еще у меня были ситуации типа
A,B:TLable;
...
A:=B;
A.Free;
B.Free; //access violation at memory read
skywalker (2002-02-13 16:50:00) [7]Потому что элементы массивов являются указателями
McSimm (2002-02-13 16:47:00) [8]А почему SetLength(A,0) должно освобождать B?
На примере строк:
var
A, B: String;
A := "12345";
B := A;
A := "";
Разве логично было, если бы здесь B тоже стало равно "" ?