C++ 无效的指针处理策略

C++ 无效的指针处理策略,c++,pointers,C++,Pointers,我认为如果在函数中传递null指针,只需让它gp,我们就可以很容易地找到根本原因。但我的队友说,我们应该避免在生产代码中使用gp时间,如果应用程序通常崩溃,客户可能会感到不安,尽管根本原因可能包含在一些空指针保护中 当需要验证指针是否为空时,将使用哪种方法 HRESULT function(const int* pNumber) { { POINTER CHECK for pNumber... } ... } 方法1-忽略无效案例 if(pNumber) { int a

我认为如果在函数中传递null指针,只需让它gp,我们就可以很容易地找到根本原因。但我的队友说,我们应该避免在生产代码中使用gp时间,如果应用程序通常崩溃,客户可能会感到不安,尽管根本原因可能包含在一些空指针保护中

当需要验证指针是否为空时,将使用哪种方法

HRESULT function(const int* pNumber)
{
    { POINTER CHECK for pNumber... }
    ...
}
方法1-忽略无效案例

if(pNumber)
{
    int a = *pNumber;   
}   
assert(pNumber);
int a = *pNumber;
if(!pNumber)
{
    OutputDebugString(L"Error Null pointer in function.\n");
    return E_POINTER;
}
  • 无GP
  • 可能输入异常流量
  • 难以找到根本原因
方法2-在调试模式下断言指针,警告

if(pNumber)
{
    int a = *pNumber;   
}   
assert(pNumber);
int a = *pNumber;
if(!pNumber)
{
    OutputDebugString(L"Error Null pointer in function.\n");
    return E_POINTER;
}
  • 可以在释放模式下运行GP
  • 切勿进入异常流量
  • 容易找到根本原因
方法3-留下调试消息并返回错误代码

if(pNumber)
{
    int a = *pNumber;   
}   
assert(pNumber);
int a = *pNumber;
if(!pNumber)
{
    OutputDebugString(L"Error Null pointer in function.\n");
    return E_POINTER;
}
  • 无GP
  • 切勿在功能内输入异常流量。如果忽略返回的E_指针,客户可能会进入异常流出侧
  • 默默地难以找到根本原因
方法4-抛出逻辑错误异常-让调用方捕获

if(!pNumber)
{
    throw std::logic_error("Null pointer of pNumber in function");
};
  • 无GP
  • 堆栈展开时,在没有资源管理(RAII)的代码序列中可能存在资源泄漏
  • 切勿进入异常流量
  • 很难找到异常抛出的位置
I priffer方法2

assert(pNumber);
int a = *pNumber;
因为,在调试模式下,您可以很容易地识别断言失败发生的位置。即使在释放模式下,它也能确保空值不会继续存在于函数内部。用户不会看到任何异常行为,应用程序将正常工作

I普里弗方法2

assert(pNumber);
int a = *pNumber;
因为,在调试模式下,您可以很容易地识别断言失败发生的位置。即使在释放模式下,它也能确保空值不会继续存在于函数内部。用户不会看到任何异常行为,应用程序将正常工作

I普里弗方法2

assert(pNumber);
int a = *pNumber;
因为,在调试模式下,您可以很容易地识别断言失败发生的位置。即使在释放模式下,它也能确保空值不会继续存在于函数内部。用户不会看到任何异常行为,应用程序将正常工作

I普里弗方法2

assert(pNumber);
int a = *pNumber;

因为,在调试模式下,您可以很容易地识别断言失败发生的位置。即使在释放模式下,它也能确保空值不会继续存在于函数内部。用户不会看到任何异常行为,应用程序将正常工作

异常是一种严重的违约行为,如果您有两个通过接口进行通信的模块,这是有意义的。对于cpp单元本地的静态函数来说,抛出它就不那么容易了。考虑访问超过末端的阵列。它还假设对方会抓住它

其他人都不够好

  • assert(pNumber)单独是很弱的。可能有一种行为是
    特定于释放模式,您将无法捕获它。而且是
    仅限于在调试中测试的输入范围
    从所有人)
  • 忽略无效的情况,如上所示是你的头在插件中 像鸵鸟一样趴在地上
  • OutputDebugString
    弱于assert。开发人员最终会让您 事情会随着错误信息滑落,你会习惯的 我会停止阅读
因此,如果我不使用异常,我将使用

assert(pNumber);
if(pNumber)
{

}
else
{
   //Log with a logger which has different logging level to the level you seem fit 
}

异常是一种严重的违约行为,如果您有两个通过接口进行通信的模块,则这是有意义的。对于cpp单元本地的静态函数来说,抛出它就不那么容易了。考虑访问超过末端的阵列。它还假设对方会抓住它

其他人都不够好

  • assert(pNumber)单独是很弱的。可能有一种行为是
    特定于释放模式,您将无法捕获它。而且是
    仅限于在调试中测试的输入范围
    从所有人)
  • 忽略无效的情况,如上所示是你的头在插件中 像鸵鸟一样趴在地上
  • OutputDebugString
    弱于assert。开发人员最终会让您 事情会随着错误信息滑落,你会习惯的 我会停止阅读
因此,如果我不使用异常,我将使用

assert(pNumber);
if(pNumber)
{

}
else
{
   //Log with a logger which has different logging level to the level you seem fit 
}

异常是一种严重的违约行为,如果您有两个通过接口进行通信的模块,则这是有意义的。对于cpp单元本地的静态函数来说,抛出它就不那么容易了。考虑访问超过末端的阵列。它还假设对方会抓住它

其他人都不够好

  • assert(pNumber)单独是很弱的。可能有一种行为是
    特定于释放模式,您将无法捕获它。而且是
    仅限于在调试中测试的输入范围
    从所有人)
  • 忽略无效的情况,如上所示是你的头在插件中 像鸵鸟一样趴在地上
  • OutputDebugString
    弱于assert。开发人员最终会让您 事情会随着错误信息滑落,你会习惯的 我会停止阅读
因此,如果我不使用异常,我将使用

assert(pNumber);
if(pNumber)
{

}
else
{
   //Log with a logger which has different logging level to the level you seem fit 
}

异常是一种严重的违约行为,如果您有两个通过接口进行通信的模块,则这是有意义的。对于cpp单元本地的静态函数来说,抛出它就不那么容易了。考虑访问超过末端的阵列。它还假设对方会抓住它

其他人都不够好

  • assert(pNumber)单独是很弱的。可能有一种行为是
    特定于释放模式,您将无法捕获它。而且是
    仅限于在调试中测试的输入范围
    从所有人)
  • 忽略无效的情况,如上所示是你的头在插件中 像鸵鸟一样趴在地上
  • OutputDebugString
    弱于assert。开发人员最终会让您 万事如意