【发布时间】:2015-03-31 06:11:11
【问题描述】:
我认为如果在函数中传递了空指针,就让它gp,我们可以很容易地找到根本原因。但是我的队友说我们应该避免生产代码中的 gp 时间,如果应用程序通常崩溃,客户可能会感到不安,尽管根本原因可能会被一些空指针保护所覆盖。
当您需要验证指针是否为空时,您会使用哪种方法?
HRESULT function(const int* pNumber)
{
{ POINTER CHECK for pNumber... }
...
}
方法一 - 忽略无效的情况
if(pNumber)
{
int a = *pNumber;
}
- 没有 GP
- 可能进入异常流
- 很难找到根本原因
方法 2 - 断言指针,调试模式下的警告
assert(pNumber);
int a = *pNumber;
- 5 月 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),代码序列中可能会发生资源泄漏。
- 切勿进入异常流
- 很难找到抛出异常的地方
【问题讨论】:
-
一般保护错误,一般是在引用无效地址或0x00000000时,应用程序立即中止或崩溃。
-
如果您将 GP 大写并且至少提及一次您想要它的意思,您的问题会有所改善。也就是说,由于您使用的是 C++,显然是方法 5,传递一个引用,这将强制调用者首先验证他们的指针。
-
@UlrichEckhardt 你应该这样回答:)