Есть указатель надо проверить был ли указатель разыменован. И можно ли с нии работать. (определить не был ли он до этого удален.) Заранее благодарен.
Quantum присоединяюсь к вопросу... Код (Text): Есть указатель надо проверить был ли указатель разыменован. имхо нереально!
P_F Реально Есть указатель, ставим на ту память атрибут PAGE_NOACCESS, ставим обработчик и ждём, когда кто-нибудь обратится к той памяти ("разыменует" указатель). Если никто не обращался, значит указатель не разыменовывали. Ньюансов много, но теоретически - это ответ на вопрос
реально с помощью HeapSize() или HeapWalk() это если указатель не кучу. указатель на стэк проверить сравнив его с ESP (для многопоточного приложения сначала определить к стэку какого потока относится этот указатель)
По разыменованием указателя обычно понимается приведение его к безымянному типу void, т.е: MyType* ptr1 = new MyTYpe(); void* ptr2 = (void*)ptr1; Проверить действительный тип объекта на который указывает ptr2 можно попробывать с помощью операции typeid( ptr2 ).name(). Это точно сработает, если вызвать typeid для указателя при приведении действительно типа к базовому, но возможно и для разыменнованного указателя сработает. Если определение имени типа невозможно - будет возбуждено исключение. Для работы необходимо запускать компилятор с флагом поддержки RTTI ( для микрософтовского /GR ).
Но указатель на удаленную память тоже не разыменованный. По английски его называют wild или invalid, по нашему недействительным. Под разыменованием обычно понимают процедуру *, то есть обращение по адресу указателя, в таком свете термин "разыменованный указатель" вообще не корректный . Я отвечал в контексте вопроса - т.е предположил что автор имея указатель, хочет узнать является ли он действительным и если да узнать тип на который он указывает.
TarasCo Верно. По-английски это называется "dereferencing", то есть, процедура, обратная referencing - созданию ссылки, указателя на объект. Угу, я понял.