![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли проверить указатель на корректность?
SPeller © (2010-04-29 04:17:00)Есть ли стандартные механизмы проверки некого указателя на корректность? Например, что этот блок памяти выделен текущим менеджером памяти и при обращении к нему не будет AV?
oxffff (2010-04-29 14:16:00) [41]
> Anatoly Podgoretsky © (29.04.10 13:04) [17]
> > oxffff (29.04.2010 12:37:16) [16]
>
> Никто еще не смог придумать надежного механизма определения
> корректности указателей.
1. Читать умеем? У потребителя билет, по которому доступ осуществляется к объекту кучи.
2. Интересно, а как тогда работает сборщик мусора в управляемой куче. (Память аллокирована пока есть ссылка. Равно как и обратное есть корретная ссылка пока аллокирована память)?
Anatoly Podgoretsky (2010-04-29 13:04:00) [42]> oxffff (29.04.2010 12:37:16) [16]
Никто еще не смог придумать надежного механизма определения корректности указателей.
oxffff (2010-04-29 12:37:00) [43]
> Anatoly Podgoretsky © (29.04.10 12:20) [15]
> > oxffff (29.04.2010 11:13:13) [13]
>
> Можно, но только для действительного указателя, а для не
> действительно обычно реализуешь AV и то если повезет, хуже
> если не повезет.
Моя мысль глубже, чем вы написали.
В таком подходе указатель представляет не адрес, а билет, по которому происходит доступ. А валидность билета проверяется функцией, которая возвращает ссылку на объект. При уничтожении объекта связанный с ним билет анулируется. При создании объекта на том же месте, билет будет другим. Поэтому проверить валидность можно.
Аналогия сеансовый ключ в windows NT.
Anatoly Podgoretsky (2010-04-29 12:20:00) [44]> oxffff (29.04.2010 11:13:13) [13]
Можно, но только для действительного указателя, а для не действительно обычно реализуешь AV и то если повезет, хуже если не повезет.
Anatoly Podgoretsky (2010-04-29 12:19:00) [45]> Ins (29.04.2010 11:05:12) [12]
Не на ожидаемые, а на правильные, а то можно получить ожидаемыt, но не совсем те, поскольку возможна завязка Obj := Create, Free, Create. И даже без второго Create
oxffff (2010-04-29 11:13:00) [46]
> Ins © (29.04.10 11:05) [12]
> В моем понимании корректный указатель это тот, который указывает
> на адрес где лежат ожидаемые тобой данные. В противном случае
> указатель некорректный. Так вот, для выявления таких корректных
> указателей механизма не то что не существует, его и не может
> существовать
Хочешь сказать, что технически нельзя реализовать такой механизм?
А если рассмотреть указатель не как значение,а как некоторую функцию от этого значения?
Ins (2010-04-29 11:05:00) [47]В моем понимании корректный указатель это тот, который указывает на адрес где лежат ожидаемые тобой данные. В противном случае указатель некорректный. Так вот, для выявления таких корректных указателей механизма не то что не существует, его и не может существовать. Отсутствие AV и указание на реально выделенный блок не дает гарантии, что он уже не указывает на что-то другое
Anatoly Podgoretsky (2010-04-29 10:26:00) [48]А может и без зарплаты останется, нам же подробности неизвестны.
brother (2010-04-29 10:16:00) [49]> Хочешь оставить автора темы без решения?
так может он и сам может через "велосипед" решить?
Плохиш (2010-04-29 10:12:00) [50]
> SPeller © (29.04.10 04:17)
>
> Есть ли стандартные механизмы проверки некого указателя
> на корректность?
А смысл? Типa, у дерьмокодера левая рука не знает, что кодит правая? Или чаво вчера накодил сегодня забыл?
oxffff (2010-04-29 10:04:00) [51]Есть например стандартный способ. Написать Pierre le Riche,
чтобы он добавил такую функцию.
oxffff (2010-04-29 10:01:00) [52]
> brother © (29.04.10 09:54) [6]
> > [5] oxffff © (29.04.10 09:49)
> > Всегда есть нестандартные механизмы.
>
>
> > Есть ли стандартные механизмы
>
> ?
Формально ты прав. А по человечески? :)
Хочешь оставить автора темы без решения?
brother (2010-04-29 09:54:00) [53]> [5] oxffff © (29.04.10 09:49)
> Всегда есть нестандартные механизмы.
> Есть ли стандартные механизмы
?
oxffff (2010-04-29 09:49:00) [54]Всегда есть нестандартные механизмы.
Anatoly Podgoretsky (2010-04-29 07:33:00) [55]> SPeller (29.04.2010 04:17:00) [0]
Такого механизма не существует.
Рууки (2010-04-29 06:28:00) [56]Посмотреть реализацию менеджера памяти можно во включаемом файле 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}
SPeller (2010-04-29 06:08:00) [57]Надеялся что не надо заводить свою заглушку менеджера памяти :) Я просто не знаком с этой темой совсем, как работает МП не представляю, знаю только что он есть )
Рууки (2010-04-29 06:03:00) [58]
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;
Напиши свои функции работы с памятью, в которых веди список выделенных блоков памяти. Добавь к ним функцию проверки блока на "выделенность". В общем-то, для такого минимального функционала, работы и тестирования на пару часов.