Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

отличия Assign от p<>nil


Страницы:   1 2

денизко ©   (2007-10-09 17:24:00) 

Объясните дураку зачем нужна ф-ция Assign, если можно написать
if p<>nil then ...

 И как все таки узнать был ли убит объект, если после вызова деструктора Free, переменная-объект по-прежнему не nil и указывает на недоступный кусок памяти?


ANTPro   (2007-10-11 16:29:00) [1]

> [33] Alkid ©   (11.10.07 10:48)

[-------0] Информация    : Экземпляр GlobalLog класса TLog создан.
[------27] Информация    : Экземпляр RenderTime класса TPerformance создан.
[-------8] Информация    : Экземпляр FPSCounter класса TPerformance создан.
[-------8] Отладка       : Экземпляр $00144488 класса TUserInput создан.
[-------9] Отладка       : Экземпляр $00147DD8 класса TProcArray создан.
[-------8] Отладка       : Экземпляр $00145F28 класса TRender создан.
[------81] Отладка       : Экземпляр $00146020 класса TWindow создан.
[------11] Отладка       : Экземпляр $00150F50 класса TLights создан.
[-------8] Отладка       : Экземпляр $0014D810 класса TLight создан.
[-------8] Отладка       : Экземпляр $001440C8 класса TCore создан.
[-------9] Отладка       : Экземпляр $00152FD0 класса TCamera создан.
[-------8] Отладка       : Экземпляр $001530B0 класса TCamera создан.
[-------8] Отладка       : Экземпляр $001530A0 класса TSkyBox создан.
[-------9] Отладка       : Экземпляр $001530D8 класса TObject3D создан.
[-------8] Отладка       : Экземпляр $00153168 класса TFileStream создан.
[-------9] Отладка       : Файл D:\Downloads\ANTPro\spacewar[5]\SpacePlane.bin открыт/создан.
[------25] Отладка       : Экземпляр $00153168 класса TFileStream разрушен.
[------24] Отладка       : Экземпляр $00160BE8 класса TCamera создан.
[-------9] Отладка       : Экземпляр $00153050 класса TModel создан.
[-------8] Информация    : Экземпляр DebugCounter класса TPerformance создан.
[-------8] Информация    : Среднее время выполнения счетчика DebugCounter: 0 ms
[-------9] Информация    : Экземпляр DebugCounter класса TPerformance разрушен.
[----1095] Отладка       : Экземпляр $00163908 класса TFileStream создан.
[-------4] Отладка       : Файл SpacePlane.bin открыт/создан.
[------26] Отладка       : Экземпляр $00163908 класса TFileStream разрушен.
[---10832] Отладка       : Экземпляр $00163908 класса TFileStream создан.
[------29] Отладка       : Файл SpacePlane.bin открыт/создан.
[------25] Отладка       : Экземпляр $00163908 класса TFileStream разрушен.
[---16824] Отладка       : Экземпляр $00163908 класса TFileStream создан.
[------26] Отладка       : Файл SpacePlane.bin открыт/создан.
[------26] Отладка       : Экземпляр $00163908 класса TFileStream разрушен.
[---13143] Отладка       : Экземпляр $00163908 класса TFileStream создан.
[------25] Отладка       : Файл SpacePlane.bin открыт/создан.
[------25] Отладка       : Экземпляр $00163908 класса TFileStream разрушен.
[----5764] Отладка       : Экземпляр $00163908 класса TFileStream создан.
[-------8] Отладка       : Файл SpacePlane.bin открыт/создан.
[------25] Отладка       : Экземпляр $00163908 класса TFileStream разрушен.

[---11930] Отладка       : Экземпляр $00145E30 класса TGame разрушен.
[------22] Отладка       : Экземпляр $00152FD0 класса TCamera разрушен.
[-------9] Отладка       : Экземпляр $001530B0 класса TCamera разрушен.
[-------8] Отладка       : Экземпляр $001530A0 класса TSkyBox разрушен.
[-------8] Отладка       : Экземпляр $001530D8 класса TObject3D разрушен.
[-------9] Отладка       : Экземпляр $00160BE8 класса TCamera разрушен.
[-------8] Отладка       : Экземпляр $00153050 класса TModel разрушен.
[-------9] Отладка       : Экземпляр $001440C8 класса TCore разрушен.
[-------8] Отладка       : Экземпляр $00144488 класса TUserInput разрушен.
[-------8] Отладка       : Экземпляр $00147DD8 класса TProcArray разрушен.
[-------9] Отладка       : Экземпляр $0014D810 класса TLight разрушен.
[-------8] Отладка       : Экземпляр $00150F50 класса TLights разрушен.
[-------8] Отладка       : Экземпляр $00145F28 класса TRender разрушен.
[-------9] Отладка       : Экземпляр $00146020 класса TWindow разрушен.
[-------8] Информация    : Среднее время выполнения счетчика RenderTime: 16 ms
[-------8] Информация    : Экземпляр RenderTime класса TPerformance разрушен.
[-------9] Информация    : Среднее время выполнения счетчика FPSCounter: 6421 ms
[-------8] Информация    : Экземпляр FPSCounter класса TPerformance разрушен.
[-------8] Информация    : Экземпляр GlobalLog класса TLog разрушен.


:)


Anatoly Podgoretsky   (2007-10-11 13:23:00) [2]

> Alkid  (11.10.2007 10:48:33)  [33]

А согласно Мерфи - велика, да и нафига нужна программа, которая зависит от погоды на Марсе.


Alkid   (2007-10-11 10:48:00) [3]


> Дельфийский менеджер может повторно использовать
> освобожденную объектом память для другого.

Да, такая вероятность есть, хотя и невелика.


Leonid Troyanovsky   (2007-10-11 09:28:00) [4]


> Alkid ©   (11.10.07 08:48) [31]

> сигнатуру и невиртуальный метод, которые проверяет IsBadPtr

Дельфийский менеджер может повторно использовать
освобожденную объектом память для другого.

--
Regards, LVT.


Alkid   (2007-10-11 08:48:00) [5]

Я пользовался такой фишкой: создавал поле, в котором хранил сигнатуру и невиртуальный метод, которые проверяет IsBadPtr, а потом проверяет сигнатуру. В конструкторе сигнатура инициализируется, в деструкторе затирается.

Если нет уверенности, что ссылка указывает на валидный объект, можно проверять таким образом. Недостаток один - из-за отсутствия в Дельфи множественного наследования эту фишку нельзя реализовать в отдельном классе и привносить в классы сторонней иерархии, но можно основать свою иерархию на классе с такой возможность.

Ещё замечу, что я такой приём юзал только для отладки. А вообще считаю, что писать программы надо так, что бы было ясно кто и когда кого создаёт и удаляет.


Сергей М.   (2007-10-10 16:28:00) [6]


> денизко   (10.10.07 12:28) [22]


> меня всего лишь интересует средства проверки состояния объекта,
>  на кот. ссылается ссылка


Нет объекта - нет и и его "состояния".

Более того, на месте "убитого" объекта может оказаться совсем другой объект, и тогда дальнейшее поведение не учитывающего такую ситуацию алгоритма непредсказуемо.


Суслик   (2007-10-10 16:23:00) [7]


> [28] ZeroDivide ©   (10.10.07 16:00)
> Суслик ©   (09.10.07 18:25) [11]
> по сабжу - я не пишу Assigned никогда, всегда <> nil пишу.
> удобней мне так
> Так уж и никогда? :)
> Для эвентов пишешь!


у меня нет ивентов (не люблю их) - обычно классы целые передаю в вирт. методами.

потом как-то можно это делать, так кажется

if @MyKeyEvent <> nil then


ZeroDivide   (2007-10-10 16:00:00) [8]


Суслик ©   (09.10.07 18:25) [11]

по сабжу - я не пишу Assigned никогда, всегда <> nil пишу.
удобней мне так


Так уж и никогда? :)

Для эвентов пишешь!

var
 MyKeyEvent: TKeyEvent;
begin

//Ругнется здесь, хотя по сути - тоже указатель на процедуру объекта
 if MyKeyEvent <> nil then
     MyKeyEvent := nil;

//Ок
 if Assigned(MyKeyEvent) then
     MyKeyEvent := nil;


Sha   (2007-10-10 15:13:00) [9]

> денизко

Из того, что память занята никак не следует,
что там лежит тот же объект.


Leonid Troyanovsky   (2007-10-10 13:10:00) [10]


> Anatoly Podgoretsky ©   (10.10.07 13:03) [24]

> Может и существует, но обратиться к нему нельзя.

Да, конечно.

Я просто имел ввиду, что если б исполнилось желание Коляна,
то и уважаемому денизко было б просто проверять существование.

--
Regards, LVT.


Суслик   (2007-10-10 13:08:00) [11]

вообще в рамках FastMM (манагер памяти в дельфи2007 и 2006) есть такая фишка, как full debug mode.
При его включенности память после дестроя забивается неким мусором ($08 кажется). VMT подменяется. В итоге вызовы вирт. методов всегда 100% определяют жив объект или нет. Ясно дело, что такой режим тормозной очень. Но искать места вызова мертвых объектов можно.

Для невиртуальных методов это ясное дело не работает. Т.е. обращение к памяти мертвого объекта никак не отловишь.


Anatoly Podgoretsky   (2007-10-10 13:03:00) [12]

> Leonid Troyanovsky  (10.10.2007 12:33:23)  [23]

> если ссылка nil, то объекта не существует.

Может и существует, но обратиться к нему нельзя.

P := TObject.Create;
P := nil;


Leonid Troyanovsky   (2007-10-10 12:33:00) [13]


> денизко   (10.10.07 12:28) [22]

>  Но я озадачен немного другим вопросом, нежели Kolan. Он
> хотел чтобы при деструкторе все ссылки на объект принимали
> значение nil. А меня всего лишь интересует средства проверки
> состояния объекта, на кот. ссылается ссылка: был он уничтожен
> или нет

Ну, на самом деле, оба эти желания совпадают, т.е.,
если ссылка nil, то объекта не существует.

> Или в общем случае даже так: могу ли я работать (вызывать
> методы и читать свойства) с объектом, на кот. указывает
> некая ссылка?

Если ссылка валидна, то можешь.

--
Regards, LVT.


денизко   (2007-10-10 12:28:00) [14]


> Leonid Troyanovsky
> http://www.delphimaster.ru/cgi-bin/forum.pl?id=1190379982&n=18

 Спасибо за ссылку. Внимательно прочитал.
 Но я озадачен немного другим вопросом, нежели Kolan. Он хотел чтобы при деструкторе все ссылки на объект принимали значение nil. А меня всего лишь интересует средства проверки состояния объекта, на кот. ссылается ссылка: был он уничтожен или нет. Или в общем случае даже так: могу ли я работать (вызывать методы и читать свойства) с объектом, на кот. указывает некая ссылка?
 Вот уважаемый MetalFan привел интересный для меня код, но говорят, что работает лишь в D2006... Я в своей D7 посмотрел что происходит при вызове Free, оказалось, что в некоторых случаях Longint(p)+8 равен 1 и после деструктора зануляется, и Longint(p)+12 равен 4 и также зануляется... Но это все "нелегально", может сработать в паре тройке случаев...


Ping   (2007-10-10 09:36:00) [15]

Я понимаю, есть FreeAndNil, есть FreeNotification, можно в конце концов вручную вести списки "учета", где отмечать, что такой-то объект был только что уничтожен, а эти еще живы и т.д. НО! Почему бы не иметь под рукой такую полезную функцию, скажем CheckIsFreed, как обозвал ее MetalFan ? Ну удобно же! Разве нет?

Интерфейсы. Подсчет ссылок и самоудаление при отсутствии оных. Плюс "бонус" в виде строгой  инкапсуляции.


Leonid Troyanovsky   (2007-10-10 09:25:00) [16]


> денизко   (10.10.07 09:14) [19]

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1190379982&n=18

--
Regards, LVT.


денизко   (2007-10-10 09:14:00) [17]


> evvcom ©
>и не морочь людям голову своими вопросами,

 Дружище, извини ради Бога! Я то по простоте душевной думал что форум для любых вопросов по Делфи! Я ж не знал что он только для "правильных", т.е. таких вопросов, кот. не будут людям морочить голову.

 Приношу свои извинения всем, кому, заморочил голову :)) Я не нарочно :)

 По теме:
 я вот тоже сначала пытался IsBadReadPtr использовать, только я пытался читать непосредственно тот кусок памяти, на который указывает переменная-объект. Но IsBadReadPtr(p) исправно возвращала false, т.е. память прекрасно читалась.
 А вообще почему я задался этим вопросом:
 меня удручает отсутствие такого инструмента, кот. мог бы показать мне состояние объекта: жив он или нет. Я понимаю, есть FreeAndNil, есть FreeNotification, можно в конце концов вручную вести списки "учета", где отмечать, что такой-то объект был только что уничтожен, а эти еще живы и т.д. НО! Почему бы не иметь под рукой такую полезную функцию, скажем CheckIsFreed, как обозвал ее MetalFan ? Ну удобно же! Разве нет?
 Я пытался сделать ее сам, ничего не получилось. Потому и обратился к народу: кто интересовался подобным?


evvcom   (2007-10-10 08:43:00) [18]


> все равно 100проц. гарантии нет

потому занятие такой фигней, так или иначе будет регулярно приводить к плавающим ошибкам (ошибка то есть, то нет). Если у тебя одна ссылка на объект, то используй FreeAndNil и не морочь людям голову своими вопросами, если ссылок на объект несколько, используй FreeNotification.


Суслик   (2007-10-10 00:13:00) [19]


> чес говоря я привел код, который работает только в D2006.
> ..
> как оказалось, в разных версиях делфи по-разному менеджер
> памяти работает...

не надо такими вещами заниматься - все равно 100проц. гарантии нет.


MetalFan   (2007-10-09 23:02:00) [20]


> Что находится по адресу LongInt(P) - 4

чес говоря я привел код, который работает только в D2006...
как оказалось, в разных версиях делфи по-разному менеджер памяти работает...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо