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

Вниз

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

Наверх




Память: 0.48 MB
Время: 0.039 c
2-1178390834
Wind
2007-05-05 22:47
2007.05.27
мастер построения Сonnectionstring


1-1174929830
Express
2007-03-26 21:23
2007.05.27
Как программно закрыть 1С:Предприятие?


2-1178726622
Strate
2007-05-09 20:03
2007.05.27
Не могу понять почему это работает :)


15-1177875190
ArtemESC
2007-04-29 23:33
2007.05.27
Паскаль-парсер...


2-1178445164
Loop
2007-05-06 13:52
2007.05.27
Сортировка TreeView





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