2015-03-31 39 views
0

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

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

HRESULT function(const int* pNumber) 
{ 
    { POINTER CHECK for pNumber... } 
    ... 
} 

方法1 - 忽略无效的情况下

if(pNumber) 
{ 
    int a = *pNumber; 
} 
  • 没有GP
  • 可能进入异常流量
  • 很难找到根源

方法2 - 断言指针,在调试模式

assert(pNumber); 
int a = *pNumber; 
  • 月GP警告在释放模式
  • 从未进入异常流量
  • 容易找到根源

方法3 - 留下调试信息并返回错误代码

if(!pNumber) 
{ 
    OutputDebugString(L"Error Null pointer in function.\n"); 
    return E_POINTER; 
} 
  • 没有GP
  • 不会进入函数内部异常流量。客户可以进入异常流出方,如果他忽略E_POINTER返回
  • 默默很难找到根源

方法4 - 抛出一个logic_error例外 - 让来电者抓

if(!pNumber) 
{ 
    throw std::logic_error("Null pointer of pNumber in function"); 
}; 
  • 否GP
  • 堆栈退出时没有资源管理(RAII)的代码序列中可能会发生资源泄漏。
  • 从未进入异常流量
  • 很难找到其中的例外是扔
+0

gp究竟是什么? – rozina 2015-03-31 06:19:43

+0

一般保护错误,通常在您引用无效地址或0x00000000时发生,然后应用程序立即中止或崩溃。 – 2015-03-31 06:21:40

+4

如果你大写GP,并且至少提到一次你想要的含义,你的问题就会有所改善。也就是说,因为你使用的是C++,所以显然是方法5,传递一个引用,这将强制调用者首先验证他们的指针。 – 2015-03-31 06:37:42

回答

2

如果取消引用nullptr,您输入的未定义行为的土地。这意味着,你的编译器没有义务去做anything sensible,所以这应该真的被避免。它也可能决定,因为它是非法的,所以它从未发生过,所以它删除了相应的代码(从而优化它),并且你有逻辑错误而没有发生一般保护错误。

我个人更喜欢assert -case,如果nullptr是绝对无效的,但在这种情况下,参考文献无论如何都可能更明智。我不认为有一个总体政策,因为它严重依赖于周围的逻辑。

0

我priffer方法2

assert(pNumber); 
int a = *pNumber; 

因为,在调试模式下,您可以轻松地识别断言失败发生在哪里。即使在释放模式下它也确保null值不会继续进入里面的函数。用户不会看到任何异常行为,应用程序将正常工作。

+2

assert如何影响发布模式下的程序?我认为assert在发布模式下被删除。 – rozina 2015-03-31 06:21:58

+0

在C++中没有“调试模式”和“发布模式”这样的东西,它们是MSVCisms。然而,如果宏'NDEBUG'是'#defined',那么'assert()'就会被剥离,而这个宏通常是为优化(非调试)构建而定义的。 – 2015-03-31 06:42:10

1

异常是一种严重的违约行为,如果您有两个通过接口进行通信的模块,这是有意义的。对于一个cpp单元本地的静态函数来说并不是那么简单。考虑访问过去的数组。它也假定对方会抓住它。

其他都不够好。

  • assert(pNumber);孤单弱。可能会有一个特定于发布模式的行为,并且您不会捕获它。此外,它是 限于您在调试中测试的输入范围(远远大于全部的 )。
  • 忽略如上所示的无效情况,就像插入鸵鸟一样将您的头插入 地面。
  • OutputDebugString比断言弱。你最终会让 的东西滑动错误信息,你会习惯很多你 将停止阅读它们。

所以如果我不使用例外,我将使用

assert(pNumber); 
if(pNumber) 
{ 

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