[英]Whether to pass shared pointer or raw pointer to a function
我使用的一些第三方 API 適用於原始指針,但我的客戶端代碼中都有智能指針。
當我想在 API 周圍編寫一個包裝器 function 時,我面臨一個問題:是否將共享指針或其原始指針作為 arguments 傳遞到下面。
像這樣:
智能指針版本
// my wrapper
void MyWrapper(const std::shared_ptr<MyClassA>& pInObj, std::shared_ptr<MyClassB>& out_pOutObj) {
ThirdParty_DoStuff(pInObj.get(), out_pOutObj.get());
}
// my client code
auto inObj = std::make_shared<MyClassA>();
auto outObj = std::make_shared<MyClassB>();
MyWrapper(inObj, outObj);
原始指針版本
// wrapper
void MyWrapper(MyClassA* pInObj, MyClassB* out_pOutObj) {
assert(pInObj && out_pOutObj);
ThirdParty_DoStuff(pInObj, out_pOutObj);
}
// client code
auto inObj = std::make_shared<MyClassA>();
auto outObj = std::make_shared<MyClassB>();
MyWrapper(inObj.get(), outObj.get());
如果有一天 function 必須與其他類型的 memory 管理一起使用,我認為第二個版本更可重用。
我建議使用引用/原始指針,具體取決於您是否要傳遞nullptr
。 為什么? 盡可能少地傳遞是一個很好的指導方針 - 如果您不需要增加引用計數或對shared_ptr
傳遞做任何特定的事情,則它不是必需的並且可能會產生誤導。
關於您的問題-如果包裝的 API 可以處理nullptr
,兩者都是相當安全的。 如果不是(這是您的assert
建議的),引用會更安全。
由於您通過引用傳遞,因此引用計數對於所有方法都將以相同的方式工作。 如果您按值傳遞,它將增加 function 調用的引用計數。
總而言之,我建議的解決方案:
// wrapper
void MyWrapper(MyClassA& pInObj, MyClassB& out_pOutObj) {
ThirdParty_DoStuff(&pInObj, &out_pOutObj);
}
// client code
auto inObj = std::make_shared<MyClassA>();
auto outObj = std::make_shared<MyClassB>();
MyWrapper(*inObj, *outObj);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.