Форум: "Основная";
Текущий архив: 2011.11.13;
Скачать: [xml.tar.bz2];
ВнизМожно ли проверить указатель на корректность? Найти похожие ветки
← →
SPeller © (2010-04-29 04:17) [0]Есть ли стандартные механизмы проверки некого указателя на корректность? Например, что этот блок памяти выделен текущим менеджером памяти и при обращении к нему не будет AV?
← →
Рууки (2010-04-29 06:03) [1]
type
PMemoryManager = ^TMemoryManager;
TMemoryManager = record
GetMem: function(Size: Integer): Pointer;
FreeMem: function(P: Pointer): Integer;
ReallocMem: function(P: Pointer; Size: Integer): Pointer;
end;
procedure GetMemoryManager(var MemMgr: TMemoryManager);
procedure SetMemoryManager(const MemMgr: TMemoryManager);
function IsMemoryManagerSet: Boolean;
Напиши свои функции работы с памятью, в которых веди список выделенных блоков памяти. Добавь к ним функцию проверки блока на "выделенность". В общем-то, для такого минимального функционала, работы и тестирования на пару часов.
← →
SPeller © (2010-04-29 06:08) [2]Надеялся что не надо заводить свою заглушку менеджера памяти :) Я просто не знаком с этой темой совсем, как работает МП не представляю, знаю только что он есть )
← →
Рууки (2010-04-29 06:28) [3]Посмотреть реализацию менеджера памяти можно во включаемом файле getmem.inc.
Но получить доступ к выделенным блокам памяти можно. Правда, учитывая отсутствие в оригинале определения DEBUG_FUNCTIONS, придется перекопилировать System.pas:{$IFDEF DEBUG_FUNCTIONS}
{ Inspector Query; implementation in GETMEM.INC; no need to conditionalize that }
THeapBlock = record
Start: Pointer;
Size: Cardinal;
end;
THeapBlockArray = array of THeapBlock;
TObjectArray = array of TObject;
function GetHeapBlocks: THeapBlockArray;
function FindObjects(AClass: TClass; FindDerived: Boolean): TObjectArray;
{ Inspector Query }
{$ENDIF}
← →
Anatoly Podgoretsky © (2010-04-29 07:33) [4]> SPeller (29.04.2010 04:17:00) [0]
Такого механизма не существует.
← →
oxffff © (2010-04-29 09:49) [5]Всегда есть нестандартные механизмы.
← →
brother © (2010-04-29 09:54) [6]> [5] oxffff © (29.04.10 09:49)
> Всегда есть нестандартные механизмы.
> Есть ли стандартные механизмы
?
← →
oxffff © (2010-04-29 10:01) [7]
> brother © (29.04.10 09:54) [6]
> > [5] oxffff © (29.04.10 09:49)
> > Всегда есть нестандартные механизмы.
>
>
> > Есть ли стандартные механизмы
>
> ?
Формально ты прав. А по человечески? :)
Хочешь оставить автора темы без решения?
← →
oxffff © (2010-04-29 10:04) [8]Есть например стандартный способ. Написать Pierre le Riche,
чтобы он добавил такую функцию.
← →
Плохиш © (2010-04-29 10:12) [9]
> SPeller © (29.04.10 04:17)
>
> Есть ли стандартные механизмы проверки некого указателя
> на корректность?
А смысл? Типa, у дерьмокодера левая рука не знает, что кодит правая? Или чаво вчера накодил сегодня забыл?
← →
brother © (2010-04-29 10:16) [10]> Хочешь оставить автора темы без решения?
так может он и сам может через "велосипед" решить?
← →
Anatoly Podgoretsky © (2010-04-29 10:26) [11]А может и без зарплаты останется, нам же подробности неизвестны.
← →
Ins © (2010-04-29 11:05) [12]В моем понимании корректный указатель это тот, который указывает на адрес где лежат ожидаемые тобой данные. В противном случае указатель некорректный. Так вот, для выявления таких корректных указателей механизма не то что не существует, его и не может существовать. Отсутствие AV и указание на реально выделенный блок не дает гарантии, что он уже не указывает на что-то другое
← →
oxffff © (2010-04-29 11:13) [13]
> Ins © (29.04.10 11:05) [12]
> В моем понимании корректный указатель это тот, который указывает
> на адрес где лежат ожидаемые тобой данные. В противном случае
> указатель некорректный. Так вот, для выявления таких корректных
> указателей механизма не то что не существует, его и не может
> существовать
Хочешь сказать, что технически нельзя реализовать такой механизм?
А если рассмотреть указатель не как значение,а как некоторую функцию от этого значения?
← →
Anatoly Podgoretsky © (2010-04-29 12:19) [14]> Ins (29.04.2010 11:05:12) [12]
Не на ожидаемые, а на правильные, а то можно получить ожидаемыt, но не совсем те, поскольку возможна завязка Obj := Create, Free, Create. И даже без второго Create
← →
Anatoly Podgoretsky © (2010-04-29 12:20) [15]> oxffff (29.04.2010 11:13:13) [13]
Можно, но только для действительного указателя, а для не действительно обычно реализуешь AV и то если повезет, хуже если не повезет.
← →
oxffff © (2010-04-29 12:37) [16]
> Anatoly Podgoretsky © (29.04.10 12:20) [15]
> > oxffff (29.04.2010 11:13:13) [13]
>
> Можно, но только для действительного указателя, а для не
> действительно обычно реализуешь AV и то если повезет, хуже
> если не повезет.
Моя мысль глубже, чем вы написали.
В таком подходе указатель представляет не адрес, а билет, по которому происходит доступ. А валидность билета проверяется функцией, которая возвращает ссылку на объект. При уничтожении объекта связанный с ним билет анулируется. При создании объекта на том же месте, билет будет другим. Поэтому проверить валидность можно.
Аналогия сеансовый ключ в windows NT.
← →
Anatoly Podgoretsky © (2010-04-29 13:04) [17]> oxffff (29.04.2010 12:37:16) [16]
Никто еще не смог придумать надежного механизма определения корректности указателей.
← →
oxffff © (2010-04-29 14:16) [18]
> Anatoly Podgoretsky © (29.04.10 13:04) [17]
> > oxffff (29.04.2010 12:37:16) [16]
>
> Никто еще не смог придумать надежного механизма определения
> корректности указателей.
1. Читать умеем? У потребителя билет, по которому доступ осуществляется к объекту кучи.
2. Интересно, а как тогда работает сборщик мусора в управляемой куче. (Память аллокирована пока есть ссылка. Равно как и обратное есть корретная ссылка пока аллокирована память)?
← →
Ins © (2010-04-29 14:43) [19]
> oxffff © (29.04.10 14:16) [18]
Предлагаешь автору в своей программе реализовать что-то похожее на автоматический уборщик мусора? Ну а я предлагаю аккуратно работать с указателями. За всю практику ни разу не возникала потребность проверить валидность указателя или ссылки. Что я делаю неправильно?
← →
oxffff © (2010-04-29 14:52) [20]
> Ins © (29.04.10 14:43) [19]
>
> > oxffff © (29.04.10 14:16) [18]
>
>
> Предлагаешь автору в своей программе реализовать что-то
> похожее на автоматический уборщик мусора? Ну а я предлагаю
> аккуратно работать с указателями. За всю практику ни разу
> не возникала потребность проверить валидность указателя
> или ссылки. Что я делаю неправильно?
Утверждаешь без IMHO.
> Так вот, для выявления таких корректных указателей механизма
> не то что не существует, его и не может существовать.
← →
Ins © (2010-04-29 15:00) [21]
> Утверждаешь без IMHO.
)))))))
Довожу до сведения, совершенно ВСЕ сказанное на любом форуме любым рядовым участником является IMHO. И да, от своих слов не отказываюсь.
← →
b z (2010-04-29 16:05) [22]
> рядовым участником
А не рядовым (кстати что это?) уже догма? :)
← →
Rouse_ © (2010-04-29 16:21) [23]
> Например, что этот блок памяти выделен текущим менеджером
> памяти и при обращении к нему не будет AV?
IsBadReadPtr / IsBadWritePtr устроит? Ну или VirtualQuery()...
← →
Ega23 © (2010-04-29 17:09) [24]try..except - чем не проверка?
← →
Anatoly Podgoretsky © (2010-04-29 20:02) [25]> Ega23 (29.04.2010 17:09:24) [24]
Не корректный указатель не обязан приводить к исключению
← →
Игорь Шевченко © (2010-04-29 21:14) [26]У венды есть такой способ, HeapValidate+HeapWalk для юзеровских функций и VirtualQuery для системных.
← →
Демо © (2010-04-30 00:02) [27]
> Anatoly Podgoretsky © (29.04.10 12:19) [14]
> > Ins (29.04.2010 11:05:12) [12]Не на ожидаемые, а на
> правильные, а то можно получить ожидаемыt, но не совсем
> те, поскольку возможна завязка Obj := Create, Free, Create.
> И даже без второго Create
Ссылки на экземпляры классов - это не указатели.
> А смысл? Типa, у дерьмокодера левая рука не знает, что кодит
> правая? Или чаво вчера накодил сегодня забыл?
Думаешь, ты всегда помнишь свой дерьмокод?
> SPeller © (29.04.10 04:17)
> Есть ли стандартные механизмы проверки некого указателя
> на корректность? Например, что этот блок памяти выделен
> текущим менеджером памяти и при обращении к нему не будет
> AV?
Если бы возникла необходимость, я бы для интереса реализовал простейший набор функций, которые через стандартные функции выделяли/освобождали память, но при этом вели справочник выделенных блоков памяти.
Неэффективное решение, и работать будет только для явных выделений памяти, но рабочее.
← →
Игорь Шевченко © (2010-04-30 00:15) [28]
> Ссылки на экземпляры классов - это не указатели.
почему ?
← →
Плохиш © (2010-04-30 00:35) [29]
> Демо © (30.04.10 00:02) [27]
> Ссылки на экземпляры классов - это не указатели.
А что это?
> > А смысл? Типa, у дерьмокодера левая рука не знает, что
> кодит
> > правая? Или чаво вчера накодил сегодня забыл?
>
>
> Думаешь, ты всегда помнишь свой дерьмокод?
За много лет ни разу не потребовалось обсуждаемого сабжа. Что я делаю не так?
← →
Демо © (2010-04-30 00:39) [30]
> Что я делаю не так?
Всё.
> Игорь Шевченко © (30.04.10 00:15) [28]
> > Ссылки на экземпляры классов - это не указатели.почему
> ?
К указателям применима адресная арифметика, к ссылкам - нет, так как не имеет смысла.
← →
Плохиш © (2010-04-30 00:44) [31]Мая рыдалъ...
← →
Игорь Шевченко © (2010-04-30 00:45) [32]
> К указателям применима адресная арифметика, к ссылкам -
> нет, так как не имеет смысла.
"Покажи нашему человеку со средним образованием, покажи ему твердый шанкр и спроси: "какой это шанкр - твердый или мягкий?" - он обязательно брякнет: "мягкий, конечно"; а покажи ему мягкий - так он и совсем растеряется. А там - нет. Там, может быть, не знают, сколько стоит "зверобой", но уж если шанкр мягкий, так он для каждого будет мягок и твердым его никто не назовет... "
С указателем все то же самое...
← →
Демо © (2010-04-30 01:14) [33]
> Плохиш © (30.04.10 00:44) [31]
> Мая рыдалъ...
Не плачь.
← →
Германн © (2010-04-30 01:16) [34]
> К указателям применима адресная арифметика, к ссылкам -
> нет
Какая-то жуткая смесь из Си, Паскаля и иже с ними.
Но тут ведь форум ДМ, ne"s pa?
И вопрос автора именно по Дельфи.
← →
Демо © (2010-04-30 01:45) [35]
> И вопрос автора именно по Дельфи.
Задайся вопросом, может ли ссылка быть указателем на произвольный кусок памяти? А указатель?
Можно ли указатель на PChar увеличить на единицу? А ссылку на объект?
← →
Германн © (2010-04-30 01:54) [36]
> Задайся вопросом, может ли ссылка быть указателем на произвольный
> кусок памяти?
А где в сабже упомянут термин "ссылка"?
А у отвечающих на форуме ДМ нет принципиальной разницы между ссылкой и указателем. Бо ни о какой "адресной арифметике" они знать не хотят.
← →
Демо © (2010-04-30 09:08) [37]
> Германн © (30.04.10 01:54) [36]
>
> > Задайся вопросом, может ли ссылка быть указателем на произвольный
>
> > кусок памяти?
>
> А где в сабже упомянут термин "ссылка"?
> А у отвечающих на форуме ДМ нет принципиальной разницы между
> ссылкой и указателем. Бо ни о какой "адресной арифметике"
> они знать не хотят.
Вот именно!
Про ссылки вопроса не было-)
Некий указатель - расплывчато достаточно.
← →
Игорь Шевченко © (2010-04-30 11:12) [38]Демо © (30.04.10 01:45) [35]
Займись на досуге увеличением на единицу переменной типа Pointer
И скажи, что такое ссылка в терминах Object pascal
← →
Демо © (2010-04-30 13:26) [39]
> Займись на досуге увеличением на единицу переменной типа
> Pointer
А в чём проблема?
> И скажи, что такое ссылка в терминах Object pascal
Лень самому напрягаться...
http://transl-gunsmoker.blogspot.com/2009/09/blog-post.htmlСсылки (References)
Многие типы в Delphi фактически являются указателями, но притворяются простыми типами. Я называю такие типы ссылочными. Примерами таких типов являются динамические массивы, строки, объекты и интерфейсы. Все они являются указателями "под капотом" языка, но с некоторой дополнительной семантикой и часто со скрытым содержанием.
Динамические массивы (dynamic arrays)
Многомерные динамические массивы
Строки (Strings)
Объекты (Objects)
Интерфейсы (Interfaces)
Ссылочные параметры
Нетипизированные параметры
Что отличает ссылки (references) от указателей (pointers):
Ссылки неизменяемы. Вы не можете увеличить или уменьшить ссылку. Ссылки указывают на определённые структуры, но никогда не указывают в середину них, как, например, указатели на данные массива в примерах выше.
Ссылки не используют синтаксис указателей. Это скрывает тот факт, что они являются указателями, и делает их сложнее для понимания для тех, кто не знаком с этой темой (и поэтому люди делают с ними вещи, которых делать нельзя).
Не путайте такие ссылки со ссылочными типами (reference types) в C++. Они во многом отличаются.
← →
Игорь Шевченко © (2010-04-30 15:52) [40]Демо © (30.04.10 13:26) [39]
> http://transl-gunsmoker.blogspot.com/2009/09/blog-post.html
Gunsmoker - это не object pascal language guide.
> > Займись на досуге увеличением на единицу переменной типа
>
> > Pointer
>
>
> А в чём проблема?
> К указателям применима адресная арифметика
У тебя тип Pointer поддерживает арифметику ?
или это тоже не указатель ?
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2011.11.13;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.004 c