C++ 如何在不退出的情况下处理空指针?

C++ 如何在不退出的情况下处理空指针?,c++,winapi,null-pointer,C++,Winapi,Null Pointer,当我得到空指针时,有没有更好的方法来处理空点而不是MessageBox并退出?我的老师告诉我使用exit()不是一个好方法。这是我的密码: CCheckBoxUI *pCbSwitch = static_cast<CCheckBoxUI*> (pItem->FindSubControl(_T("switch"))); ASSERT(pCbSwitch && "Failed to find contronl"); if (pCbSwitch ==

当我得到空指针时,有没有更好的方法来处理空点而不是
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);
    }
CCheckBoxUI*pCbSwitch=static_cast(pItem->FindSubControl(_T(“开关”));
断言(pCbSwitch&“未能找到控件”);
如果(pCbSwitch==nullptr)
{
MessageBox(NULL,_T(“未能找到控件”),_T(“提示”),0;
出口(-1);
}

最安全的方法可能是忽略可能的空指针。这是您的控件,知道您在其上放置了一个
开关
元素,因此您知道
查找子控件
将成功
FindSubControl
本身并不知道这一点,这就是为什么它记录为可能返回空指针的原因


当然,您可能有一个bug,但这就是为什么在调试构建中有assert

最安全的方法可能是忽略可能的空指针。这是您的控件,知道您在其上放置了一个
开关
元素,因此您知道
查找子控件
将成功
FindSubControl
本身并不知道这一点,这就是为什么它记录为可能返回空指针的原因


当然,您可能有一个bug,但这就是为什么在调试构建中有assert

pItem->FindSubControl(\u T(“开关”))真的会失败吗

除非您没有其他功能从您的子角色中添加或删除子角色。。。唯一的失败可能是控件名称中的键入错误

这不是“正常行为”,而是调试版本通过断言捕获的错误。 错误纠正后,不可能出现故障,因此没有其他检查有意义

除非。。。您的内存空间非常有限,可能是因为框架无法创建控件,所以无法获取它。但在创建子控件时,您应该已经知道这种情况。但是在那种情况下。。。甚至显示消息框也不可能


在任何情况下,如果您想优雅地退出,不要调用exit,而是抛出一个异常。您可以在调用者(或main)中捕获它并以干净的方式退出。

可以
pItem->FindSubControl(\u T(“开关”))
真的失败了吗

除非您没有其他功能从您的子角色中添加或删除子角色。。。唯一的失败可能是控件名称中的键入错误

这不是“正常行为”,而是调试版本通过断言捕获的错误。 错误纠正后,不可能出现故障,因此没有其他检查有意义

除非。。。您的内存空间非常有限,可能是因为框架无法创建控件,所以无法获取它。但在创建子控件时,您应该已经知道这种情况。但是在那种情况下。。。甚至显示消息框也不可能


在任何情况下,如果您想优雅地退出,不要调用exit,而是抛出一个异常。您可以在调用者(或main)中捕获它,然后以干净的方式退出。

如果您不想调用exit,请不要。您已经有了断言。为什么要重复检查?可以使用
return
,以便在退出程序之前返回主函数进行一些清理(关闭文件处理程序等)。或者您可以编写一个错误处理函数,生成消息框、记录错误、执行清理并退出程序。检查两次显然是错误的。只有一次。至于如何处理由你决定的失败。我们无法为您做出决定。处理错误的许多方法之一是抛出异常并“捕获”它们。好处是,当它包含在try{}catch(){}块中时,您可以停止执行该块,并且可以在catch()块中处理异常。如果您不想调用exit,请不要调用。您已经拥有了assert。为什么要重复检查?可以使用
return
,以便在退出程序之前返回主函数进行一些清理(关闭文件处理程序等)。或者您可以编写一个错误处理函数,生成消息框、记录错误、执行清理并退出程序。检查两次显然是错误的。只有一次。至于如何处理由你决定的失败。我们无法为您做出决定。处理错误的许多方法之一是抛出异常并“捕获”它们。好处是,当它被包含在try{}catch(){}块中时,您可以停止执行该块,并在catch()块中处理异常。“您可以在调用程序(或主程序)中捕获它,然后以清理方式退出。”-或者不捕获它,然后以受控方式退出。@IInspectable:当然。问题是你有多想对用户“公平”。一个GUI应用程序在没有消息的情况下关闭,将用户设置为WTF模式!以受控方式关闭并不意味着在没有任何反馈的情况下立即关闭。例如,您可以设置自己的终止处理程序()。在Windows上,您可以设置一个未处理的异常筛选器(),并获取异常记录以写入一个有意义的转储文件()。“您可以在调用者中捕获它(或在main中)并以清理方式退出。”-或者不捕获它并以受控方式退出。@IInspectable:当然。问题是你有多想对用户“公平”。一个GUI应用程序在没有消息的情况下关闭,将用户设置为WTF模式!以受控方式关闭并不意味着在没有任何反馈的情况下立即关闭。例如,您可以设置自己的终止处理程序()。在Windows上,可以设置未处理的异常筛选器(),并获取异常记录以写入有意义的转储文件()。