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

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

New()


Страницы:   1 2 3

][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. давно надо было в фак это закинуть
сколько можно на одно и тоже отвечать...


Страницы:   1 2 3

Наверх

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