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();


Суслик   (2004-09-22 09:40:00) [41]

Вот Defunct образованный вроде парень, а такие советы дает иногда, просто эталон некорректного программирования. :))

Немного теории.

Манагер памяти дельфи устроен таким образом, что маленькие кусочки памяти (до 4кб если не ошибаюсь) при освобождении остаются как бы совственностью дельфи. И если после dispose туда что-то записть - огромнаявероятность неполучения АV. Способ, предложенный, defunct c try except end очень ненадеждный. Если хочется проверить инициализирован ли указатель пусть один - строить логику работы программы так, чтобы в этом не возникало потребности.


KSergey   (2004-09-22 08:05:00) [42]

> [10] Defunct ©   (22.09.04 03:04)
> jack128 ©   (22.09.04 02:51) [9]
>
> > Угу, только вот на какие данные..
> А кого это волнует, в вопросе не конкретизировалось, что
> надо проверить соответствие данных. Надо только проверить
> указывает указатель на что-либо. Да указывает.

В вопросе было про валидность данных, на которые указывает указатель.

> иначе вылезет RangeCheck

С какого такого перепугу??


Defunct   (2004-09-22 03:04:00) [43]

jack128 ©   (22.09.04 02:51) [9]

> Угу, только вот на какие данные..
А кого это волнует, в вопросе не конкретизировалось, что надо проверить соответствие данных. Надо только проверить указывает указатель на что-либо. Да указывает.

> ch := p^; // 100 к 1 - AV не будет..
А с чего бы там быть AV? Все в порядке, прочитаем 50-й символ если {$R-} (тем более, что он там есть), иначе вылезет RangeCheck exception, я же не утверждал, что должен быть именно AV.


jack128   (2004-09-22 02:51:00) [44]

Defunct ©   (22.09.04 2:47) [8]
Если указатель не равен Nil, то он уже по определению указывает на данные.

Угу, только вот на какие данные..

> Попутно еще и валидность данных отловится (если не
> Nil).

s := StringOfChar('A', 100);
p := @s[50];
s := StringOfChar('A', 20);
try
 ch := p^; // 100 к 1 - AV не будет..
except
end;


Defunct   (2004-09-22 02:47:00) [45]

> Первые две проверяют указатель на неравенство nil, но он может быть и не равен nil но и не указывать куда либо.

Если указатель не равен Nil, то он уже по определению указывает на данные.

> например мусор в стеке или уже освобождённый объект/структура/др.

Ну и что? (выражаясь словами автора )  "была над указателем проведена процедура New()", а что уж потом с данными сделали не важно, главное, что факт New, или @, или присваивания, или GetMem мы установили.

> Ловишь AV ? А ведь если "повезет" его может и не быть.
Что значит повезет? Если P=Nil тут уж однозначно ответ ясен. Попутно еще и валидность данных отловится (если не Nil).

На вопрос
>>Вы что ни разу не пользовались хотя бы одной из этих конструкций
Вы так и не ответили.. Хотя я и не ждал, так как уверен, что вы использовали все перечисленные конструкции [4] в своих программах.


Германн   (2004-09-22 02:28:00) [46]

Присоединяюсь к GuAV ©   (22.09.04 00:52) [2]
>В наиболее общем случае никак и незачем.
с одним лишь изменением (может быть, чисто синтаксическим).
Следовало бы ответить "В общем случае никак и незачем."

Это отвечая на сабж. Если нужно что-то большее, пожалуйста к нашим телепатам! Или сформируйте грамотнее свой вопрос.


GuAV   (2004-09-22 01:42:00) [47]

GuAV ©   (22.09.04 01:40) [5]

> Есть и другие способы достижения того чтобы указател укарывал
> на данные, например @ оператор.


> Первые две проверяют указатель на неравенство nil, но он
> может быть и не равен nil но и не указывать куда либо.

Кстати здесь же и объяснение [2]


GuAV   (2004-09-22 01:40:00) [48]

Defunct ©   (22.09.04 01:16) [4]

> Все они проверяют условие существования данных под указателем

Первые две проверяют указатель на неравенство nil, но он может быть и не равен nil но и не указывать куда либо. например мусор в стеке или уже освобождённый объект/структура/др.

> а значит показывают, что (говоря словами автора вопроса)
> использовалась процедура New.

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

> 3. Try
>     P.Field := ..
>   Except
>   End;

Ловишь AV ? А ведь если "повезет" его может и не быть. И вообще отлов AV - идея ИМХО настолько плохая, что подобная техника никогда не должна быть использована.


Defunct   (2004-09-22 01:16:00) [49]

GuAV ©   (22.09.04 00:52) [2]
это почему же?

Вы что ни разу не пользовались хотя бы одной из этих конструкций:
1. If Assigned( P ) Then ...
2. If P <> Nil Then ...
3. Try
    P.Field := ..
  Except
  End;


Все они проверяют условие существования данных под указателем, а значит показывают, что (говоря словами автора вопроса) использовалась процедура New.


jack128   (2004-09-22 01:14:00) [50]

Defunct ©   (22.09.04 0:33) [1]
Try
   P^ := ....
 Except
   < не был создан >
 End;

это гарантии не дает..


GuAV   (2004-09-22 00:52:00) [51]

В наиболее общем случае никак и незачем.


Defunct   (2004-09-22 00:33:00) [52]

Var P: Pointer = nil;

1. if P <> Nil Then <был создан, не обязательно New>

2. Try
    P^ := ....
  Except
    < не был создан >
  End;


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

Наверх

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