2015-06-14 2 views
0

Как я могу достоверно проверить (в IL или с некоторыми методами, предоставленными .NET), является ли заданный native int действительной ссылкой на объект (O)? Указатель мог быть извлечен из некоторого отладчика, и он может быть недействительным (или собран после его возврата). Просто возвращая его как объект, выдает неуправляемый ExecutionEngineException по неверным адресам. Я пробовал castclass до object, который бросает NullPointerException в случае некорректных ссылок, но также вызывает плохое AccessViolationException с некоторыми адресами. Есть ли лучший способ сделать это, не бросая какие-либо неуловимые исключения или разлагая память?Тестирование, если ссылка на данный объект действительна

+0

Вы можете перечислить все объекты кучи, используя API-интерфейс профилировщика, и посмотреть, находится ли этот указатель в наборе всех объектов. Вы также должны были бы заморозить всю цепочку при этом, чтобы не было объектов, движущихся по GC. Вам действительно нужно пересечь кучу, чтобы проверить указатель, потому что указываемые данные могут быть серединой байта [], который просто выглядит как объект. – usr

+0

@usr По иронии судьбы, указатель фактически исходит из API-интерфейса профилировщика (или аналогичного). Большинство возвращаемых им объектов работают, но некоторые из них бросают EEE. – IllidanS4

+0

Я вижу проблемы с сборкой мусора впереди, когда объекты перемещаются, но ваше бедное целое остается. – sisve

ответ

0

В комментарии к вопросу вы сказали, что указатель поступает из API-интерфейса профилировщика, поэтому я предполагаю, что ваш отладчик реализован с использованием API-интерфейса профилировщика.

Нет надежного способа проверить, является ли указатель на объект (ObjectID) действительным. Даже если это указывает на то, что кажется действительным объектом, это может быть не тот же объект. Вместо этого обычный подход заключается в track the object через обратные вызовы GC и обновляет/отменяет ваши ссылки в зависимости от ситуации.

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

Смежные вопросы