2016-08-10 3 views
0

Когда я получил нулевой указатель, есть ли лучший способ обработать нулевую точку вместо MessageBox и выйти? Мой учитель сказал мне, что это не очень хороший способ использовать exit(). Вот мой код:Как обращаться с нулевым указателем без выхода?

CCheckBoxUI *pCbSwitch = static_cast<CCheckBoxUI*> (pItem->FindSubControl(_T("switch"))); 
    ASSERT(pCbSwitch && "Failed to find contronl"); 
    if (pCbSwitch == nullptr) 
    { 
     MessageBox(NULL, _T("Failed to find contronl"), _T("tip"), 0); 
     exit(-1); 
    } 
+6

Если вы не хотите вызывать exit, не делайте этого. –

+1

У вас уже есть утверждение. Почему вы дважды проверяете? – molbdnilo

+0

@molbdnilo Как я знаю, ASSERT будет недействительным в выпуске. Таким образом, это утверждение будет проигнорировано. – XHLin

ответ

4

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

Уверен, у вас может быть ошибка, но поэтому у вас есть утверждение в отладочных сборках.

1

Can pItem->FindSubControl(_T("switch"))действительно не удается?

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

Это не «нормальное поведение», а ошибка, которую ваша версия отладки уловит с утверждением. После исправления ошибки не происходит никаких сбоев, поэтому никакая другая проверка не имеет смысла.

Если вы не находитесь в таком ограниченном пространстве памяти, которое может быть каркасом, невозможно создать элемент управления, поэтому вы не можете получить. Но это ситуация, которую вы уже знаете, создавая суб-элементы управления. Но в этом случае ... даже отображение окна сообщения может быть невозможно!

В любом случае, если вы хотите быть защищенным, изящно выйдите, не вызывайте exit, а выполните исключение. Вы можете поймать его в вызывающем (или в основном) и выйти с очищенным способом.

+2

* «Вы можете поймать его в вызывающем (или в главном) состоянии и выйти с очищенным способом». * - Или не поймайте его и не выйдите контролируемым образом так же. – IInspectable

+0

@ Разумный: конечно. Проблема в том, насколько вы хотите быть «честным» с пользователем. Приложение GUI, которое отключается без сообщений, задает пользователя в режиме WTF! –

+2

Выключение с контролируемым режимом не означает немедленного отключения без обратной связи. Например, вы можете установить собственный обработчик завершения ([std :: set_terminate] (http://en.cppreference.com/w/cpp/error/set_terminate)). В Windows вы можете установить необработанный фильтр исключений ([SetUnandledExceptionFilter] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms680634.aspx)) и получить запись об исключении, чтобы написать значимую дамп file ([MiniDumpWriteDump] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms680360.aspx)). – IInspectable

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