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

Вниз

SetLength   Найти похожие ветки 

 
skywalker ©   (2002-02-13 16:41) [0]

Народ, как работает 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
не освобождает память и оставляет кучу мусора в оперативке?
Кто знает ответ, помогите!!


 
McSimm ©   (2002-02-13 16:47) [1]

А почему SetLength(A,0) должно освобождать B?

На примере строк:
var
A, B: String;

A := "12345";
B := A;
A := "";

Разве логично было, если бы здесь B тоже стало равно "" ?


 
skywalker ©   (2002-02-13 16:50) [2]

Потому что элементы массивов являются указателями


 
skywalker ©   (2002-02-13 16:53) [3]

еще у меня были ситуации типа

A,B:TLable;

...
A:=B;
A.Free;
B.Free; //access violation at memory read




 
Виктор Щербаков ©   (2002-02-13 16:59) [4]

Элементы массивов в твоем случае не указатели, чего не скажешь о A и B из skywalker © (13.02.02 16:53).

Чтобы "access violation at memory read" не возникало используй
FreeAndNil:
FreeAndNil(A);
FreeAndNil(B);


 
McSimm ©   (2002-02-13 17:04) [5]

Строки это тоже указатели.
Если отследить приведенный мною код, можно будет увидеть, что после выполнения
B := A;
и B и A будут равны не только как строки, но и как указатели, т.е. ссылаться на одну и ту же область памяти.

Однако выполнение
A := "что-нибудь";
или
A[1] := "#";
представляет собой выделение новой памяти под A и последующее изменение. Поэтому изменение A не влечет за собой изменение B.


 
skywalker ©   (2002-02-13 17:12) [6]

Так как же с A и B?
если допустим у меня в массиве есть воложенность
н-ой степени, освободит ли SetLength() все указатели?

А если динамическому массиву присваивать nil, то он освобождается?

Я заметил такую фигню, особенно при работе с базами данных, что
прога со временем занимает все больше и болше памяти, явно мусорит. После перезагрузки системы у меня появляется лишних 20 мг оперативки!!!


 
Виктор Щербаков ©   (2002-02-13 17:18) [7]


> А если динамическому массиву присваивать nil, то он освобождается?


Да освобождается.


> если допустим у меня в массиве есть воложенность
> н-ой степени, освободит ли SetLength() все указатели?


Нет. Вложенность - это ведь что-то вроде "массив указателей на массивы". Вот и освобождай каждый динамический массив вручную.


 
Макс Черных ©   (2002-02-13 18:05) [8]

2Виктор Щербаков
>Вот и освобождай каждый динамический массив вручную.
Это зачем? Есть ведь такая вещь как Finalize.

>skywalker ©
Настоятельно рекомендую посмотрель в help для чего нужна
процедура Finalize, и в модуле System.pas как она
реализована (_FinalizeArray - в частности).



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

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

Наверх




Память: 0.48 MB
Время: 0.009 c
4-9323
Alexey(Me)
2002-01-03 14:11
2002.03.04
E-Mail


1-9203
Анонимщик
2002-02-14 10:54
2002.03.04
Помогите с печатью метафайла


1-9180
who
2002-02-14 10:05
2002.03.04
Передача параметров из exe в exe


3-9074
Drik
2002-02-04 20:29
2002.03.04
QReport & печать на принтер


14-9297
Лана Розанова
2002-01-16 15:16
2002.03.04
Привет народу здешнему.