Как CPtrList-> RemoveHead () может вызвать исключение CInvalidArgumentException? - PullRequest
0 голосов
/ 18 марта 2019

Этот вопрос очень похож на предыдущий , на этот раз я хотел бы поближе познакомиться с предметом или хотя бы с его документацией:

Я имею делопри сбое процесса из-за CInvalidArgException при выполнении RemoveHead() объекта CPtrList, содержащего 6 записей.

Неправильный фрагмент исходного кода выглядит следующим образом:

pSingle = (SET_PARAMETER*)plMultiple->RemoveHead();

Стек вызовов выглядит следующим образом:

mfc110u.dll!AfxThrowInvalidArgException(void)
mfc110u.dll!CObList::RemoveHead(void)
Application.exe!SingleThread(void * pArg=0x0000006800000000) Line 673

Чтобы понять, что происходит, я смотрю на официальный веб-сайт документации Microsoft по CPtrList (CObList) RemoveHead () , но я не нахожу никаких ссылок на CInvalidArgException.

Просто для небольшого сравнения: для программистов на Java есть документация, которая объясняет все исключения, с которыми вы можете столкнуться при программировании (например, Официальная документация упоминает все исключения, которые могут быть сгенерированы при выполнении метода).

Я хотел бы знать, есть ли что-то подобное для программистов на C ++ (STL)?

Спасибозаранее

1 Ответ

0 голосов
/ 18 марта 2019

Проверяя исходный код для CObList, мы видим, что первая строка:

ENSURE_VALID(this);

Этот макрос определяется как:

#define ENSURE_VALID(pOb)   ENSURE_VALID_THROW(pOb, ::AfxThrowInvalidArgException() )

Что в свою очередь определяется как:

#define ENSURE_VALID_THROW(pOb, exception)  \
do { ASSERT_VALID(pOb); if (!(pOb)){exception;} } while (false)

Другими словами, это вызовет утверждение в режиме отладки, а в режиме выпуска вызовет AfxThrowInvalidArgException, что вы и видите.

Короче говоря, plMultiple является нулевым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...