![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
отличия Assign от p<>nil
денизко © (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...
как оказалось, в разных версиях делфи по-разному менеджер памяти работает...