![](/img/trans.png)
[英]Should I switch from using boost::shared_ptr to std::shared_ptr?
[英]Should I check boost::shared_ptr or std::shared_ptr before I use it?
void f(boost::shared_ptr<int> ptr)
{
if (ptr) // should we check?
// do something
}
void f2(int *p)
{
if (p) // good practice to check before using it
// do something
}
問題:我們應該在使用之前驗證shared_ptr
嗎?
不。如果它在函數的合同中它必須是有效的,那么最快的方式來引起關注調用者有bug的事實就是崩潰。 盡早失敗。
取決於在正常程序執行期間是否真的有可能shared_ptr
為null。 如果沒有,請將責任作為f
的用戶的先決條件,並且可以assert(ptr);
。 請注意,它不僅適用於shared_ptr
,而且任何指針都可以使用。 雖然你可能只想在這里使用引用。
取決於您的方案:
如果f()
是一個公共函數/ API函數,你無法控制某人可能會通過你,那么你應該檢查。
如果函數是私有成員函數或記錄為需要有效指針,那么我將使用assert
。 它具有在發布版本中沒有開銷並且在調試版本中快速顯示問題的重要性。
void f( shared_ptr<T> ptr)
{
assert( ptr && "ptr is null!" );
.....
}
是。 shared_ptr只是讓你知道何時通過計算對它的引用來釋放它分配的內存。 在使用它之前,你仍然應該驗證它是否有效,假設你沒有其他方式事先知道它肯定不會為空,但這與你是否使用shared_ptr的問題無關。
假設:如果您的void foo(shared_ptr<int> ptr)
是一個通用庫,並且您希望在運行時通知用戶nullptr
值不受支持(拋出異常)或者使用不同的代碼路徑處理它是的,它是正確檢查它。 如果你不需要使用你的foo()
將shared_ptr存儲在某處,你只需要確保該函數不支持空指針,只需傳遞一個引用,例如void foo(int &integer)
。 對於我所知道的編譯器,引用大多數時候是非可空指針(通常取決於優化選擇)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.