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

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

Можно ли проверить указатель на корректность?


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

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;


Напиши свои функции работы с памятью, в которых веди список выделенных блоков памяти. Добавь к ним функцию проверки блока на "выделенность". В общем-то, для такого минимального функционала, работы и тестирования на пару часов.


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

Наверх

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