![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
New()
][ncognito © (2004-09-22 00:28:00)Ув. господа, подскажите, как узнать был ли над указателем проведена процедура New();
GuAV (2004-09-26 02:53:00) [1]
> Насчет недокументированных приемов, да я их защищаю и часто
> применяю в защите от НСД, в защите от копирования, в коммуникациях.
возможно. но в случае [0] это вредит.
> Сколько можно цепляться к мелочам?
вот не надо только утверждать что Defunct © (22.09.04 00:33) [1] верно.
а ведь я всего только и цепляюсь что оно не верно.
> Наврятли вам удастся меня удивить.
Удивлять счас не буду, т.к. дельфи под рукой нет.
на вскидку: ещё проверте New(P1); Dispose(P1); New(P2) там же.
Defunct (2004-09-26 02:40:00) [2]GuAV © (26.09.04 02:01) [50]
> try...except никогда не используется для отлова AV при обращении к объекту, который не создан.
Сколько можно цепляться к мелочам?
да еще и после этого:
Defunct © (22.09.04 15:36) [18]
Доводы [15][17] - убедительные, согласен что в общем случае нельзя и незачем.
> Вы защищаете недокументированные приёмы. вот я найду несколько ещё, в р-те которых ваш код не будет работать. за шо боролись на то и напоролись.
Наврятли вам удастся меня удивить.
Насчет недокументированных приемов, да я их защищаю и часто применяю в защите от НСД, в защите от копирования, в коммуникациях.
GuAV (2004-09-26 02:01:00) [3]
> Если программа написана правильно,
то [2] верно, т.е. [0] не нужно.
и конструкция
try...except никогда не используется для отлова AV при обращении к объекту, который не создан.
т.е. способ try..except - пример неправильного написания программы.
Вы защищаете недокументированные приёмы. вот я найду несколько ещё, в р-те которых ваш код не будет работать. за шо боролись на то и напоролись.
Defunct (2004-09-26 01:55:00) [4]PS: как в этой ветке неоднократно отмечали:
>Суслик © (22.09.04 16:06) [21]
>Надо писать правильно.
>Anatoly Podgoretsky © (22.09.04 16:24) [22]
>Правильнее подумать об нормальной организации программы
GuAV © (22.09.04 20:09) [23]
>> Правильнее подумать об нормальной организации программы
>И это имхо самый правильный ответ на вопрос сабжа.
Palladin © (22.09.04 20:30) [24]
остальное лежит на дисциплине кодирования
>Суслик © (23.09.04 10:52) [26]
>Я тоже сказал, что нужно правильно программы
Если программа написана правильно, то коментарии в [1] абсолютно достоверны, и точно покажут был ли создан указатель или нет. Синтетические ошибки мне здесь показывать не нужно. Сам могу привести, сколько угодно ошибочных ситуаций.
GuAV (2004-09-26 01:51:00) [5]
> в третьих, вы пример после вашего изменения запускали, что
> на экране написано?
нет.
> что в данном случае отражает специально сделанную ошибку.
>
> ваш пример СЖУЛЬНИЧАЛ, подставив указателю левый адрес,
> а коментарии это жульничество раскусили.
именно это я и хотел показать, что раз эти способы выводят разный результат, гарантированно что один из них врёт. потом, вы же не предлагали исползовать оба для надёжности.
второй способ такое же жульничество как и мой пример. кстати выполните ещё такое
New(P1);
Dispose(P1);
If P1<>Nil Then ShowMessage('P1 был создан, необязательно New');
// и далее по тексту...
Defunct (2004-09-26 01:39:00) [6]> я немного изменил пример
во-первых, не надо извращать идею.
во-вторых, какой коментарий не устраивает даже с вашим изменением примера? Вы же указатель фактически создали вручную, назначили ему Адрес, а значит он вроде бы был создан, но в то же время и не создан.
в третьих, вы пример после вашего изменения запускали, что на экране написано?
на экране:
"P1 был создан не обязательно New"
"P1 не был создан"
что в данном случае отражает специально сделанную ошибку.
ваш пример СЖУЛЬНИЧАЛ, подставив указателю левый адрес, а коментарии это жульничество раскусили.
вопрос исчерпан.
Германн (2004-09-26 01:25:00) [7]Была когда-то ТВ-передача "Музыкальный ринг" (если не ошибаюсь).
Ну, на моей памяти "самая безполезная" передача. Так вот сей спор Defunct и GuAV - из той же серии.
Самая моя любимая передача из этой серии - ринг между, увы покойным Резниковым, и Игорем Корнелюком.
Люблю Питер!
Но не дороги Питерские!
GuAV (2004-09-26 01:04:00) [8]я немного изменил пример
Begin
P1:=Pointer($00BB16B8);
If P1<>Nil Then ShowMessage('P1 был создан, необязательно New');
If P2<>Nil Then ShowMessage('P2 был создан, необязательно New');
Try
P1^ := 1000;
Except
ShowMessage('P1 не был создан');
End;
Try
P2^ := 1000;
Except
ShowMessage('P2 не был создан');
End;
End;
GuAV (2004-09-26 00:57:00) [9]
> был создан, не обязательно New
P может указывать и на несозданный объект.
> < не был создан >
В это место можно попасть если был создан а после уничтожен (хотя при этом же условии можно и не попасть туда)
или в случае исключения связанного с кодом в правой части :=.
Defunct (2004-09-26 00:50:00) [10]Defunct © (26.09.04 00:40) [42]
Var P1 : PInteger = Nil;
P2 : PInteger = Nil;
Begin
New(P1);
If P1<>Nil Then ShowMessage('P1 был создан, необязательно New');
If P2<>Nil Then ShowMessage('P2 был создан, необязательно New');
Try
P1^ := 1000;
Except
ShowMessage('P1 не был создан');
End;
Try
P2^ := 1000;
Except
ShowMessage('P2 не был создан');
End;
End;
На этом вопрос исчерпан.
Defunct (2004-09-26 00:40:00) [11]-----------------------------------------------------------------
Defunct © (22.09.04 00:33) [1]
Var P: Pointer = nil;
1. if P <> Nil Then <был создан, не обязательно New>
2. Try
P^ := ....
Except
< не был создан >
End;
> Вредность совета в том, что Вы даёте неверные коментарии к Вашему коду.
Требую объяснений, в каком месте приведенного фрагмента неверный коментарий?
GuAV (2004-09-25 21:02:00) [12]
> ведь вроде как требовалось проверить значение указателя
> на актуальность
если так то согласен, использование своего ММ решает.
однако в [2] я ответил на вопрос.
default (2004-09-25 20:47:00) [13]GuAV © (25.09.04 20:44) [39]
"и потом, New может делаться в первой либе из uses в initialization. А может он и в System/SysInit использован d initialization..."
да, но скорее всего автору нужно будет проверять корректность указателей память под которую он выделял
"Угу, а как потом найти их учитывая что
P1:=P2; ?
ведь @P1<>@P2 ! т.е. как сопоставить инфу указателю ? никак."
согласен, только не понял зачем это
ведь вроде как требовалось проверить значение указателя на актуальность(1)
вопрос автора был
"Ув. господа, подскажите, как узнать был ли над указателем проведена процедура New();"
и тут ты прав, но он скорее всего имел ввиду (1)
GuAV (2004-09-25 20:44:00) [14]
> (т твоём примере нужно дополн-ую инф-ию хранить если нужно
> распо-ать указ-ли под которые была неудачная попытка выделить
> память)
Угу, а как потом найти их учитывая что
P1:=P2; ?
ведь @P1<>@P2 ! т.е. как сопоставить инфу указателю ? никак.
и потом, New может делаться в первой либе из uses в initialization. А может он и в System/SysInit использован d initialization...
default (2004-09-25 20:34:00) [15]GuAV © (25.09.04 20:26) [37]
я имел ввиду хранить инф-у о том что память под указ-ль выделилась отдельно(не ввиде ненулевого значения этого указателя, а то это несерьёзно(конечно если прогр-т не следит на их значениями, как и нужно делать вообще, я ж не говорю что так НАДО делать так делать вообще-то не надо в больш-ве случае я лишь говорю что так МОЖНО делать и всё))
то есть хранить массив адресов по которым выдел-ась память
(т твоём примере нужно дополн-ую инф-ию хранить если нужно распо-ать указ-ли под которые была неудачная попытка выделить память)
GuAV (2004-09-25 20:26:00) [16]
> подобную инф-ию можно хранить если сильно хочется
как?
в указателе нельзя - там либо объект либо nil.
хранить указатель на указатель?
хорошо, а если P1:=P2; ?
я всё ещё убеждён, что ответил правильно.
default (2004-09-25 20:13:00) [17]GuAV © (25.09.04 20:09) [34]
почему не отвечает - отвечает
надуманная проблема
подобную инф-ию можно хранить если сильно хочется
default (2004-09-25 20:11:00) [18]GuAV © (25.09.04 20:09) [34]
почему не отвечает - отвечает
надуманная проблема
GuAV (2004-09-25 20:09:00) [19]
> если сильно надо то можно подменять ф-ции делфийского менеджера
> памяти(операции с памятью само собой должны выполняться
> через них)внутри них записывать нужные данные по работе
> с памятью потом вызывать стандартный код
Допустим у нас массив из 100 указателей типа, который занимает 1 ГБ, мы вызываем для половины из них New. Естественно, память будет выделенна не для всех, т.к. на всех не хватит. Для каких мы вызвали New, неважно успешно или нет ? на это не отвечает даже подмена ф-ции делфийского менеджера памяти.
default (2004-09-25 19:05:00) [20][2]
если сильно надо то можно подменять ф-ции делфийского менеджера памяти(операции с памятью само собой должны выполняться через них)внутри них записывать нужные данные по работе с памятью потом вызывать стандартный код
P.S. давно надо было в фак это закинуть
сколько можно на одно и тоже отвечать...