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

Вниз

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

Наверх





Память: 0.46 MB
Время: 0.008 c
1-9169
Zool
2002-02-12 17:34
2002.03.04
Как узнать в каком каталоге находится моя прога?


3-9092
HDD
2002-02-05 16:13
2002.03.04
Люди добрые помогите пожалуйста


1-9153
Deus
2002-02-13 13:55
2002.03.04
Сохранение array в FileStream


1-9195
IronHawk
2002-02-12 15:37
2002.03.04
ПРОСТО ! Быстрый, тупой, вопрос !


14-9287
tovSuhov
2002-01-18 15:45
2002.03.04
Установил Windows 98 ...





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