Форум: "Основная";
Текущий архив: 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