Какова эквивалентная стандартная функция функции "AfxIsValidAddress"?
Я использовал MFC-проект, который должен быть реализован в независимой от платформы среде, используя функцию std вместо MFC/AFX.
Например: вместо CString std:: string, вместо CMutex будет использоваться std:: mutex.
Что такое независимый от платформы, C++11 std::- эквивалент функции MFC "AfxIsValidAddress"?
1 ответ
Там нет чего-то похожего на AfxIsValidAddress()
в стандартной библиотеке, и кажется, что функция на самом деле не делает столько проверки в любом случае.
См. AfxIsValidAddress (и другие) "Не работать как объявлено", в котором говорится, что функция завершается просто проверкой NULL. Это также говорит о семействе допустимых функций проверки адресов:
Существует несколько Win32 API, похожих по функциональности:
IsBadWritePtr
,IsBadHugeWritePtr
,IsBadReadPtr
,IsBadHugeReadPtr
,IsBadCodePtr
,IsBadStringPtr
, С 2004 года известно, что эти функции не подлежат восстановлению и никогда не должны использоваться. Всемогущий Рэймонд Чен и Ларри Остерман оба подробно обсуждают причины, поэтому просто короткая перефразировка: IsBad*Ptr все работает, получая доступ к проверенному адресу и перехватывая любые сгенерированные исключения. Проблема состоит в том, что некоторые из этих нарушений доступа (а именно, те, что на страницах защиты стека) никогда не должны быть обнаружены - ОС использует их для правильного увеличения стеков потоков.
Я думаю, что лучше просто следовать стандартным процедурам C++, чтобы проверить, что указатель не является nullptr
или еще лучше ограничить использование указателей в максимально возможной степени.