Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ошибка с динамическим массивом..

2.1K
17 апреля 2003 года
zhaw
14 / / 29.01.2003
Ошибка с динамическим массивом типа <name>:array of byte. Если я использую команды SetLength и Finalize во всех местах программы кроме одного, то Delphi выдаёт ошибку Invalid Pointer. Место, в котором всё работает нормально - ф-ция где инициализируются таким-же образом ещё несколько аналогичных массивов (все эти массивы являются членами одного класса). Прога большая - посему могу только кусочки кода предложить (по мылу). Подскажите, плз, кто-нить сталкивался и как с этим бороться?
2.0K
18 апреля 2003 года
Voha
74 / / 20.01.2003
Вобщето Finalize - освобождает память в куче только в том случае если никакая другая переменная уже не ссылается на данный массив. Попробуй прписвоить массиву Nil.(помоему так даже в учебнике рекомендуют, попройся в доке)
2.1K
18 апреля 2003 года
zhaw
14 / / 29.01.2003
Цитата:
Originally posted by Voha
Вобщето Finalize - освобождает память в куче только в том случае если никакая другая переменная уже не ссылается на данный массив. Попробуй прписвоить массиву Nil.(помоему так даже в учебнике рекомендуют, попройся в доке)


Наверное. Ещё только пришёл - ещё не успел глянуть. Зато вспомнилось ещё одно обстоятельство, я пытался определить длину динамического массива с помощью ф-ции
Length(<name>). После этого начинаются глюки. Может быть в Length где-то остаётся что-то??
(В конечном итоге - мне нужно переопределять длину динамич. массива - а как это сделать? Вот я и проверял на ненулевую длину - и если массив имеет ненулевой размер - я его Finalize, и по новой инициализирую).

2.0K
18 апреля 2003 года
Voha
74 / / 20.01.2003
попробуй так:
1.Объявляешь временный дин. массив, таккойже 2.размерностью, как и рабочий
3.перегоняешь все значения во временный
4.рабочему присваиваешь NIL
5.указываешь новую размерность рабочего массива
6.пререгоняешь из временного в рабочий.
(я бы сделал так)
2.1K
18 апреля 2003 года
zhaw
14 / / 29.01.2003
Цитата:
Originally posted by Voha
попробуй так:
1.Объявляешь временный дин. массив, таккойже 2.размерностью, как и рабочий
3.перегоняешь все значения во временный
4.рабочему присваиваешь NIL
5.указываешь новую размерность рабочего массива
6.пререгоняешь из временного в рабочий.
(я бы сделал так)


Но ведь это будет утечка памяти!!!!:-o
Массиву присваивать NIL без освобождения памяти....

2.0K
18 апреля 2003 года
Voha
74 / / 20.01.2003
Переменные которые были объявлены как динамические массивы, на самом деле являются просто ССЫЛКАМИ ( т.е. компилятор ведет подсчет ссылок на выделенную облать памяти, как только их количество становиться равным 0, память освобождается), таким образом для освобождения памяти, занимаемой элементами динамического массива, достаточно присвоить этой переменной значение NIL. А Finalize освободит те память только в том случае если не ссылается никакая переменная на этот массив). Вот. еще раз посмотри доку по динамическим массивам. или поищи доко по Делфи 4. Там они расписаны неплохо (они появилисс 4 версии делфей).
483
25 апреля 2003 года
DED_MOROZ
67 / / 20.03.2000
Цитата:
Originally posted by zhaw

Но ведь это будет утечка памяти!!!!:-o
Массиву присваивать NIL без освобождения памяти....


У каждого массива есть счетчик ссылок (как у COM классов) и при присвоении nil этот счетчик ссылок уменьшается, а если массив присваивается другому массиву, то сам массив не копируется а просто увеличивается счетчик ссылок на исходный. Вот поэтому две переменных могут ссылатся на один и тот же кусок памяти и если ты освободил его при помоще finalize, то во тебе и AV. Короче надо присваивать nil, а не finalize делать.

2.1K
29 апреля 2003 года
zhaw
14 / / 29.01.2003
Цитата:
Originally posted by DED_MOROZ

У каждого массива есть счетчик ссылок (как у COM классов) и при присвоении nil этот счетчик ссылок уменьшается, а если массив присваивается другому массиву, то сам массив не копируется а просто увеличивается счетчик ссылок на исходный. Вот поэтому две переменных могут ссылатся на один и тот же кусок памяти и если ты освободил его при помоще finalize, то во тебе и AV. Короче надо присваивать nil, а не finalize делать.


Огромное thnks за разъяснения. Сам наверное ещё долго бы копался P(

483
29 апреля 2003 года
DED_MOROZ
67 / / 20.03.2000
Цитата:
Originally posted by zhaw

???????? thnks ?? ???????????. ??? ???????? ??? ????? ?? ??????? P(


???, ???? ???? ???-?? ??????.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог