我认为,如果在函数中传递了空指针,只需将其设为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),代码序列中可能发生资源泄漏。
切勿进入异常流量
很难找到引发异常的地方
最佳答案
如果取消引用nullptr
,则输入未定义行为的域。这意味着您的编译器没有义务执行anything sensible,因此应避免这种情况。由于它是非法的,因此它可能还会断定它从未发生,因此它删除了相应的代码(从而对其进行了优化),并且您遇到了逻辑错误,而没有遇到一般性的保护错误。
如果assert
绝对无效,我个人更喜欢nullptr
的情况,但是在这种情况下,引用可能仍然更明智。我认为没有通用的政策,因为它在很大程度上取决于周围的逻辑。
关于c++ - 无效的指针处理策略,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29361784/