情况
我使用的某些第三方API可与原始指针一起使用,但是我的客户端代码中都有智能指针。
问题
当我想围绕API编写包装函数时,我遇到一个问题:是将共享指针还是其原始指针作为参数传递给下面。
像这样:
智能指针版本
// 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());
题我认为,如果某天该功能必须与其他类型的内存管理一起使用,则第二个版本更可重用。
最佳答案
我建议采用以下方法来查看类似以下代码的内容:
还有其他一些选项,例如weak_ptr
,但是为此,可能不值得一看。
因此,在您的示例中,我们可以看到ThirdParty_DoStuff
不拥有所有权,因此我们也不会拥有所有权,因此您可以根据参数是否为必需分别在引用和指针之间进行选择。
关于c++ - 将共享指针还是原始指针传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65035189/