Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не правильно освобождаю переменную? / 16 сообщений из 16, страница 1 из 1
28.06.2017, 17:45:11
    #39479239
InterSky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не правильно освобождаю переменную?
Я создал глобальный массив картинок:
Код: pascal
1.
var m:array[1..100] of  TImage;



Если надо создать картинку - пробегаю массив в поисках свободного места и создаю там:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
for n:=1 to 100 do
    if m[n]=nil then 
       begin
       m[n].Create(nil);
       ...
       Break;
       end;



Если мне надо удалить, делаю просто:
Код: pascal
1.
if .... then m[n].Free;



Но наверно я делаю что-то не так при удалении, так как удаляемый элемент не становится после удаления равным nil. Если посмотреть в отладчике, то в массиве после .Free элемент по прежнему имеет указатель. Ну скажем:
Код: pascal
1.
m = ($9FF01C, nil, nil, nil, ...



Значит для правильного удаления надо сделать:
Код: pascal
1.
2.
m[n].Free;
m[n]:=nil;



или можно это как-то сделать одной строкой?
...
Рейтинг: 0 / 0
28.06.2017, 17:51:31
    #39479241
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не правильно освобождаю переменную?
Free не обнуляет саму ссылку на бывший объект.

Одной строкой можно:

Код: pascal
1.
FreeAndNil(m[n]);
...
Рейтинг: 0 / 0
28.06.2017, 18:11:20
    #39479260
InterSky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не правильно освобождаю переменную?
Спасибо! Действительно теперь всё работает...
А как можно проверить ссылка на существующий объект или на удалённый?
В других языках есть взякие isNull(), is_assigned() чтобы проверить...
...
Рейтинг: 0 / 0
28.06.2017, 18:13:19
    #39479261
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не правильно освобождаю переменную?
if Assigned(XXX) then
...
Рейтинг: 0 / 0
28.06.2017, 18:16:45
    #39479265
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не правильно освобождаю переменную?
InterSkyА как можно проверить ссылка на существующий объект или на удалённый?


Никак. Ссылка на удаленный объект ничем не отличается от ссылки на неудаленный. Уже посоветовали FreeAndNil
...
Рейтинг: 0 / 0
28.06.2017, 18:56:13
    #39479283
fd00ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не правильно освобождаю переменную?
InterSky, судя по тому, как ты создаешь объекты, тебе проверки не очень помогут)
...
Рейтинг: 0 / 0
28.06.2017, 19:06:09
    #39479289
InterSky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не правильно освобождаю переменную?
Vizit0rif Assigned(XXX) then
Хм... Я нажал Ctrl+Пробел начал писать Assi... и мне показало что есть только такая процедура, по этому даже не стал проверять...


Но если нажать F1 на уже написанном Assigned - тогда действительно показывает описание функции... Но она в действительности проверяет только на nil, и после простого m[1].Free продолжает сообщать что элемент объявлен.

Всем спасибо, сделал через FreeAndNil
...
Рейтинг: 0 / 0
28.06.2017, 19:07:35
    #39479291
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не правильно освобождаю переменную?
InterSkyVizit0rif Assigned(XXX) then
Хм... Я нажал Ctrl+Пробел начал писать Assi... и мне показало что есть только такая процедура, по этому даже не стал проверять...


Но если нажать F1 на уже написанном Assigned - тогда действительно показывает описание функции... Но она в действительности проверяет только на nil, и после простого m[1].Free продолжает сообщать что элемент объявлен.

Всем спасибо, сделал через FreeAndNil

ну ты спрашивал за синтаксис - я и написал.
Так-то оно да, для просто освобожденных объектов не сработает.
...
Рейтинг: 0 / 0
28.06.2017, 20:14:37
    #39479319
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не правильно освобождаю переменную?
fd00chInterSky, судя по тому, как ты создаешь объекты, тебе проверки не очень помогут)
InterSky,
Код: pascal
1.
m[n] := TImage.Create(nil);
...
Рейтинг: 0 / 0
28.06.2017, 23:08:48
    #39479363
almswiss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не правильно освобождаю переменную?
InterSky,

Не по Фен-Шую. Открой для себя TList.
...
Рейтинг: 0 / 0
29.06.2017, 00:01:17
    #39479378
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не правильно освобождаю переменную?
almswissОткрой для себя TList.
а там и до дженериков рукой подать :)
...
Рейтинг: 0 / 0
29.06.2017, 01:30:05
    #39479389
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не правильно освобождаю переменную?
m: TArrayEx<TImage>;

;)
...
Рейтинг: 0 / 0
29.06.2017, 03:06:35
    #39479394
Жышы
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не правильно освобождаю переменную?
"Неправильно". :(
...
Рейтинг: 0 / 0
29.06.2017, 04:25:45
    #39479398
DetSimen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не правильно освобождаю переменную?
almswiss, тогдауш TObjectList.
...
Рейтинг: 0 / 0
29.06.2017, 10:21:03
    #39479499
krapotkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не правильно освобождаю переменную?
TObjectList<TMyClass>

))
...
Рейтинг: 0 / 0
29.06.2017, 10:38:30
    #39479509
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не правильно освобождаю переменную?
Скажите, а у вас реально такой код?
InterSky
Код: pascal
1.
2.
3.
4.
5.
6.
7.
for n:=1 to 100 do
    if m[n]=nil then 
       begin
       m[n].Create(nil);
       ...
       Break;
       end;


или на самом деле там
Код: pascal
1.
       m[n] := TImage.Create(nil);


?
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не правильно освобождаю переменную? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]