簡體   English   中英

是否將共享指針或原始指針傳遞給 function

[英]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());

問題

  • 就性能和 memory 安全性而言,哪種方法更好?
  • 兩種方法之間的引用計數會略有不同嗎?

如果有一天 function 必須與其他類型的 memory 管理一起使用,我認為第二個版本更可重用。

我建議采用以下方法來查看類似這樣的代碼:

在此處輸入圖像描述

還有一些其他選項,例如weak_ptr ,但為此它可能不值得一看。

因此,對於您的示例,我們可以看到ThirdParty_DoStuff沒有所有權,所以我們也不會,因此您可以分別根據參數是否強制在引用和指針之間進行選擇。

我建議使用引用/原始指針,具體取決於您是否要傳遞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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM