проверка указателя на разыменованность

Тема в разделе "WASM.WIN32", создана пользователем witcher, 19 дек 2006.

  1. witcher

    witcher New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2006
    Сообщения:
    73
    Есть указатель надо проверить был ли указатель разыменован.
    И можно ли с нии работать. (определить не был ли он до этого удален.)
    Заранее благодарен.
     
  2. witcher

    witcher New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2006
    Сообщения:
    73
    забыл добавить.
    Язык С++
     
  3. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    IsBadReadPtr
    IsBadWritePtr
     
  4. kropalik

    kropalik New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    155
    Адрес:
    msk
    IsBadReadPtr
    HeapSize
     
  5. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Кто-нибудь понял первую часть вопроса?
     
  7. P_F

    P_F New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2006
    Сообщения:
    116
    Адрес:
    Russia
    Quantum
    присоединяюсь к вопросу...
    Код (Text):
    1. Есть указатель надо проверить был ли указатель разыменован.
    имхо нереально!
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    P_F
    Реально :)
    Есть указатель, ставим на ту память атрибут PAGE_NOACCESS, ставим обработчик и ждём, когда кто-нибудь обратится к той памяти ("разыменует" указатель). Если никто не обращался, значит указатель не разыменовывали.

    Ньюансов много, но теоретически - это ответ на вопрос :)
     
  9. kropalik

    kropalik New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    155
    Адрес:
    msk
    реально с помощью HeapSize() или HeapWalk()
    это если указатель не кучу. указатель на стэк
    проверить сравнив его с ESP (для многопоточного
    приложения сначала определить к стэку какого
    потока относится этот указатель)
     
  10. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Quantum
    Может он имеет в виду RefCount?
     
  11. TarasCo

    TarasCo New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    106
    По разыменованием указателя обычно понимается приведение его к безымянному типу void, т.е:
    MyType* ptr1 = new MyTYpe();
    void* ptr2 = (void*)ptr1;

    Проверить действительный тип объекта на который указывает ptr2 можно попробывать с помощью операции
    typeid( ptr2 ).name(). Это точно сработает, если вызвать typeid для указателя при приведении действительно типа к базовому, но возможно и для разыменнованного указателя сработает. Если определение имени типа невозможно - будет возбуждено исключение. Для работы необходимо запускать компилятор с флагом поддержки RTTI ( для микрософтовского /GR ).
     
  12. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Это что-то новое. Приведение к void* - это просто приведение указателя.
     
  13. TarasCo

    TarasCo New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    106
    Вам повезло - узнали что-то новое :)
     
  14. TarasCo

    TarasCo New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    106
    Но указатель на удаленную память тоже не разыменованный. По английски его называют wild или invalid, по нашему недействительным. Под разыменованием обычно понимают процедуру *, то есть обращение по адресу указателя, в таком свете термин "разыменованный указатель" вообще не корректный :). Я отвечал в контексте вопроса - т.е предположил что автор имея указатель, хочет узнать является ли он действительным и если да узнать тип на который он указывает.
     
  15. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    TarasCo
    Верно. По-английски это называется "dereferencing", то есть, процедура, обратная referencing - созданию ссылки, указателя на объект.

    Угу, я понял.