我认为如果在函数中传递空指针,就让它通过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)的代码序列中可能会发生资源泄漏。
- 从未进入异常流量
- 很难找到其中的例外是扔
gp究竟是什么? – rozina 2015-03-31 06:19:43
一般保护错误,通常在您引用无效地址或0x00000000时发生,然后应用程序立即中止或崩溃。 – 2015-03-31 06:21:40
如果你大写GP,并且至少提到一次你想要的含义,你的问题就会有所改善。也就是说,因为你使用的是C++,所以显然是方法5,传递一个引用,这将强制调用者首先验证他们的指针。 – 2015-03-31 06:37:42