![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
New()
][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;