Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / объект удаляется, но указатель на него не зануляется - это факт, но.. / 16 сообщений из 16, страница 1 из 1
21.08.2003, 15:10
    #32243394
Guilty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объект удаляется, но указатель на него не зануляется - это факт, но..
Подозреваю, что вопрос банальный, но тем не менее.
При вызове метода free объекта происходит освобождение памяти, однако указатель на него не зануляется. Должен быть какой-то элементарный способ проверить, что метод free уже вызван. Как это красиво реализуется, подскажите?
...
Рейтинг: 0 / 0
21.08.2003, 15:13
    #32243412
pkarklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объект удаляется, но указатель на него не зануляется - это факт, но..
Код: plaintext
if SomeObject <> nil then FreeAndNil(SomeObject);
...
Рейтинг: 0 / 0
21.08.2003, 15:18
    #32243425
zDIV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объект удаляется, но указатель на него не зануляется - это факт, но..
Делаю всегда вручную, после Free (когда очень надо). Других вариантов не вижу в принципе (Self := Nil выполнять нельзя, даже в Destroy), кто подскажет - буду рад. Неплохо у меня работало зануление указателя формы (работает только в самом простом варианте, когда используется переменная формы из ее юнита и такая форма живет в приложении в единственном виде!!! - и это очень частный случай) в ее OnDestroy.
...
Рейтинг: 0 / 0
21.08.2003, 15:59
    #32243516
zDIV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объект удаляется, но указатель на него не зануляется - это факт, но..
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
procedure FreeAndNil(var Obj);
var
  Temp: TObject;
begin
  Temp := TObject(Obj);
  Pointer(Obj) := nil;
  Temp.Free;
end;

Получается, что тоже в ручную, нужно вызывать парой не var.Free и var := Nil, а то что написал pkarklin.
И такое работать, конечно не будет
Код: plaintext
1.
2.
3.
  X := TMemoryStream.Create;
  X.Free;
  if X <> Nil then FreeAndNil(X);
...
Рейтинг: 0 / 0
21.08.2003, 16:01
    #32243525
Guilty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объект удаляется, но указатель на него не зануляется - это факт, но..
2 pkarklin
А вдруг объект еще жив и выполняет какую-то работу? а мы берем указатель на него - хлоп и в nil, это не выход.
Т.е. я так понимаю проверить, что объект уже отжил свое, не занулив указатель, невозможно?
...
Рейтинг: 0 / 0
21.08.2003, 16:09
    #32243547
pkarklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объект удаляется, но указатель на него не зануляется - это факт, но..
А вдруг объект еще жив и выполняет какую-то работу? а мы берем указатель на него - хлоп и в nil, это не выход.

А это как это? Если тока ты мултитрид приложения будешь писать. А потом, указатель в nil, сие не есть уничтожение объекта.
...
Рейтинг: 0 / 0
21.08.2003, 16:16
    #32243562
kitty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объект удаляется, но указатель на него не зануляется - это факт, но..
Вы не подскажете, где правильнее вставить процедуру FreeAndNil(form2) при закрытии формы form2? В обработчике onclose или другом?
и нужно ли вообще это делать?

у меня проблемка такая, что после createform, show размер занимаемой приложением памяти увеличивается приблиз. на 600-800 кб, и после close этой формы прибавляется еще около 100 кб. Я free или FreeAndNil ставлю в обработчике onclose этой формы.
...
Рейтинг: 0 / 0
21.08.2003, 16:21
    #32243576
Guilty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объект удаляется, но указатель на него не зануляется - это факт, но..
2 pkarklin
совсем не обязательно писать многопоточное приложение, чтобы в момент проверки объекта было не известно вызван его метод free или нет. А потом
Код: plaintext
if SomeObject <> nil then FreeAndNil(SomeObject);
зануляем указатель на объект, а зачем вопрос то стоит, как проверить есть еще объект или он уже удален из памяти.
...
Рейтинг: 0 / 0
21.08.2003, 16:26
    #32243590
tygra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объект удаляется, но указатель на него не зануляется - это факт, но..
2 kitty
На OnClose

2 Guilty

FreeAndNil как раз удаляет из памяти из обнуляет указатель. После вызова этой процедуры в указателе будет nil.
Чего непонятно тут?
...
Рейтинг: 0 / 0
21.08.2003, 16:28
    #32243599
pkarklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объект удаляется, но указатель на него не зануляется - это факт, но..
2 Guilty

Совсем обязательно сбрасывать указатель в nil после уничтожения объекта и тогда у вас не будет проблем с проверкой на существование объекта.

2 kitty

А в обработчике он Close не пробовали писать Action := caFree. Тогда форма сама уничтожиться при закрытии.
...
Рейтинг: 0 / 0
21.08.2003, 16:30
    #32243608
zDIV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объект удаляется, но указатель на него не зануляется - это факт, но..
Итак, способа проверить, что метод free уже вызван, "пока" нет, в принципе объект и не обязан (может) отслеживать за всеми нашими переменными.

Что касается Form2, то тут нужно решить, нужна ли форма после ее закрытия, если нет - то в OnClose пишем Action := caFree (caHide - по умолчанию, если OnClose вообще нет, а если есть придется явно указать что-либо), если некоторое время еще нужна (для вытаскивания значений из диалога, например, то Action := caHide, а для уничтожения вызывать явно Form2.Release. Занулять переменную Form2 вовсе не обязательно, а вставлять Free или что-то другое в обр. событий формы мягко выражаясь неверно. В очень редких случаях (когда это нужно для логики программы) для определения живет-ли форма или нет (только если она задумана единственной в приложении) полезно в OnDestroy делать Form2 := Nil. Именно это я имел ввиду, и уже немного жалею, что высказался.
...
Рейтинг: 0 / 0
21.08.2003, 16:31
    #32243609
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объект удаляется, но указатель на него не зануляется - это факт, но..
FreeAndNil ???
...
Рейтинг: 0 / 0
21.08.2003, 16:36
    #32243618
zDIV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объект удаляется, но указатель на него не зануляется - это факт, но..
SysUtils. JibSkeart???
...
Рейтинг: 0 / 0
21.08.2003, 17:04
    #32243687
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объект удаляется, но указатель на него не зануляется - это факт, но..
тфуу про это уже говорилось
просто начало топика не посмотрел ...
...
Рейтинг: 0 / 0
21.08.2003, 17:33
    #32243740
CrazyMihey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объект удаляется, но указатель на него не зануляется - это факт, но..
А почему бы этому объекту (или тому, кто вызывает его Free ) не сбрасывать какой-нибудь глобальный флажок, или счётчик - на Create : Inc( Count ) , на Free : Dec( Count ) , а в программе проверять, когда этот счётчик равен 0 - все объекты этого типа в программе отработали и удалены.
...
Рейтинг: 0 / 0
21.08.2003, 17:44
    #32243757
Guilty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объект удаляется, но указатель на него не зануляется - это факт, но..
2 Горшков Михаил Алексеевич
Можно конечно и так, можно и чего-нибудь другое придумать, но изначально речь шла о том, как красиво (без) излишних наворотов проверить, был ли уже free объекта?
Пока рулит идея вызывать FreeAndNil вместо Free объекта, ну и еще, если объект форма, то спечифически обрабатывать ее события закрытия или уничтожения.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / объект удаляется, но указатель на него не зануляется - это факт, но.. / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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