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

Вниз

Dispose pointer variable by nil?   Найти похожие ветки 

 
Alexey (AZ)   (2007-03-25 15:51) [0]

Доброго вам!
У меня такой вопрос: должен ли указатель после Dispose стать nil?
Например, есть...

PObject = ^TObject
p : PObject ;
выдаю память ч/з New(p)
создаю ч/з p^ := TObject.Create;
убиваю ч/з p^.Destroy
добиваю ч/з Dispose(p); // но p не становится nil и хуже того, делфи показывает что не только указатель жив, но жив как бы и объект, хотя повторный p^.Destroy вызывает исключение как и повторный вызов Dispose(p), что свидетельствует о том, что обект убит и указатель тоже. А дебугер делфи всё равно показывает что и объект и указатель живы, причем функция описана как  Dispose(var p: pointer), т.е. должна изменять указатель... Не понимаю.


 
jack128 ©   (2007-03-25 15:53) [1]

Alexey (AZ)   (25.03.07 15:51)
т.е. должна изменять указатель...

не должна, а МОЖЕТ изменить указатель.  ПО факту - не изменяет она указатель на нил.  Сам руками обниливай его..


 
MBo ©   (2007-03-25 16:01) [2]

А хелп что говорит?


 
Alexey (AZ)   (2007-03-25 16:25) [3]

Хэлп говорит:

> Use Dispose in Delphi code to free the memory which a pointer addresses. After a call to Dispose, the value of P is undefined and it is an error to reference P.
>

Но это хер с ним, почему же тогда делфи показывает что обект есть и память жива? Или это особенность дебугера делфи?


 
Fredy314 ©   (2007-03-25 16:34) [4]

память отмечается как свободная, и следующий раз ты возможна её-же и получиш а пока ссылка указывает на туже структуру и пока туда ничего не писали структура остаётся правильной, может поэтому и такая особенность.
Лучше-бы конечно чтобы в Dispose ссылка обнулялась но что есть то есть.


 
Alexey (AZ)   (2007-03-25 16:46) [5]

Понятно. Значит виндовоз не успевает грохнуть память или сделать в неё write.


 
Anatoly Podgoretsky ©   (2007-03-25 22:07) [6]

> Alexey (AZ)  (25.03.2007 16:25:03)  [3]

Перечитай внимательно, до полного пониманияю


 
Плохиш ©   (2007-03-25 22:34) [7]

Я так понимаю, что в этом месяце проходят выделение и освобождение памяти :-D


 
Loginov Dmitry ©   (2007-03-25 22:37) [8]

> PObject = ^TObject


Зачем такое извращение?


 
Bel ©   (2007-03-26 09:48) [9]

> Alexey (AZ)   (25.03.07 16:46) [5]
> Понятно. Значит виндовоз не успевает грохнуть память или сделать в неё write.

Не виндовз, а делфёвый менеджер памяти.


 
Alexey (AZ)   (2007-03-27 14:35) [10]


> Bel ©   (26.03.07 09:48) [9]

В том-то и оно! Например апи GlobalFree мнгновенно убивает память после GlobalAlloc, я думал что с Dispose та же история должна быть по идее.

> Зачем такое извращение?
А как? По привычке так сложилось, если функция должна вернуть объект( или структуру), то быстрее работать со ссылками.

> Я так понимаю, что в этом месяце проходят выделение и освобождение
> памяти :-D

Может быть. Меня эта тема не слишком е... волнует, просто лишний раз хочу перестраховаться от сжирания памяти после часа работы без перезапуска с аппликейшеном =)


 
Плохиш ©   (2007-03-27 14:59) [11]


> > Зачем такое извращение?
> А как? По привычке так сложилось, если функция должна вернуть
> объект( или структуру), то быстрее работать со ссылками.

Дествительно, нафига изучать основы используемого языка программирования, когда есть привычка. Ещё и функцию какую-то можно приплести...


 
Alexey (AZ)   (2007-03-28 10:15) [12]

Изначально это был не класс, а структура и реализация создания структур была выведена в что-то типа:
function make:^TObjectInFuture; Если бы мы возвращали сам объект (структуру) или передавали его как параметр, то это было бы не оптимально! Можете проверить это, скомпилив пару раз и посмотрев как всё выглядит изнутри (отладчик, CPU), если знакомы с ассемблером!


 
Сергей М. ©   (2007-03-28 10:41) [13]


> Alexey (AZ)   (28.03.07 10:15) [12]


То что SizeOf(MyObjectVariable)=4 тебе ни о чем не говорит ?


 
Плохиш ©   (2007-03-28 10:44) [14]


> объект (структуру)

И мухи и котлеты в одной куче...


 
Сергей М. ©   (2007-03-28 11:02) [15]


> Если бы мы возвращали сам объект (структуру) или передавали
> его как параметр, то это было бы не оптимально


Прототипы любых обработчиков любых событий любых компонентов, заметь, имеют первым параметром Sender: TObject, а не Sender: ^TObject. Это что, "неоптимальность", по-твоему ?)


 
Alexey (AZ)   (2007-03-28 19:49) [16]

Действительно для объектов имя является указателем и работа с ним такая же как и с указателем, а для структур несколько иначе. Так например при присвоении структуры другой структуре происходит совсем не правка ссылок, в отличае от объекта, а копирование тел структуры. Так было написано в моем примере только потому что
> Изначально это был не класс, а структура

затем решил перевести в класс, отсюда и вопрос был.

Вывод по сабжу:
Dispose не обязан править указатель.

Тема закрыта, всем спасибо.



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

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

Наверх




Память: 0.5 MB
Время: 0.041 c
15-1177425719
NeyroSpace
2007-04-24 18:41
2007.05.27
Почему у Microsoft ничего не выйдет с .Net


15-1177870163
palva
2007-04-29 22:09
2007.05.27
Михаил Веллер


2-1178780591
Kostafey
2007-05-10 11:03
2007.05.27
Снова про With


1-1175194336
dreamse
2007-03-29 22:52
2007.05.27
Как запустить ярлык созданый с сетевого подключения ?


1-1174823514
Alexey (AZ)
2007-03-25 15:51
2007.05.27
Dispose pointer variable by nil?