我認爲如果在函數中傳遞空指針,就讓它通過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