繁体   English   中英

将unique_ptr传递给函数

[英]Passing unique_ptr to functions

我正试图“现代化”一些现有的代码。

  • 我有一个类,当前有一个成员变量“Device * device_”。
  • 它使用new在一些初始化代码中创建一个实例,并在destructory中有一个“delete device_”。
  • 此类的成员函数调用许多其他函数,这些函数将Device *作为参数。

这很好用,但为了“现代化”我的代码,我认为我应该将变量定义为"std::unique_ptr<Device> device_"并删除显式调用delete,这样可以使代码更安全,通常更好。

我的问题是这个 -

  • 那么我应该如何将device _变量传递给需要它作为参数的所有函数?

我可以调用.get来获取每个函数调用中的原始指针。 但这看起来很丑陋,浪费了一些首先使用unique_ptr的原因。

或者我可以更改每个函数,以便不使用“Device *”类型的参数,而是使用“std :: unique_ptr&”类型的参数。 哪个(对我来说)有点模糊了函数原型,并使它们难以阅读。

这是什么最佳做法? 我错过了其他选择吗?

Modern C ++风格中,有两个关键概念:

  • 所有权
  • 婚姻无效

所有权是关于某个对象/资源的所有者(在这种情况下,是Device的实例)。 各种std::unique_ptrboost::scoped_ptrstd::shared_ptr是关于所有权的。

然而, Nullity更简单:它只是表达给定对象是否为null,并且不关心任何其他内容,当然也不关心所有权!


你是移动类的朝实施unique_ptr (一般),虽然你可能想与深拷贝语义的智能指针如果你的目标是实现一个PIMPL。

这清楚地表明,你的班级是唯一负责这段记忆的人,并且巧妙地处理了记忆本可以泄露的各种方式。


另一方面,资源的大多数用户对其所有权不太关心。

只要函数不保持对对象的引用(将其存储在映射或其他内容中),那么重要的是对象的生命周期超过函数调用的持续时间。

因此,选择如何传递参数取决于其可能的Nullity

  • 永远不会? 传递参考
  • 可能是空的? 传递一个指针 ,一个简单的裸指针或类似指针的类(例如,在null上有一个陷阱)

这真的取决于。 如果函数必须取得unique_ptr的所有权,那么它的签名应该采用unique_ptr<Device> bv ,并且调用者应该std::move指针。 如果所有权不是问题,那么我将保留原始指针签名并使用get()传递指针unique_ptr。 如果有问题的功能不接管所有权,这并不难看。

我会使用std::unique_ptr const& 使用非const引用将为被调用函数提供重置指针的可能性。
我认为这是表达被调用函数可以使用指针而不是其他任何东西的好方法。
所以对我来说这将使界面更容易阅读。 我知道我不必乱用指针传给我。

在这种情况下,最好的做法可能不是使用std::unique_ptr ,尽管它取决于。 (通常不应该有一个指向类中动态分配对象的原始指针。虽然这也取决于。)在这种情况下你不想做的一件事就是传递std::unique_ptr (和你注意到了, std::unique_ptr<> const&有点笨拙和混淆)。 如果这是对象中唯一动态分配的指针,我只会坚持使用原始指针和析构函数中的delete 如果有几个这样的指针,我会考虑将它们中的每一个降级到一个单独的基类(它们仍然可以是原始指针)。

这对你来说可能不太可行,但是通过const unique_ptr<Device>&取代Device*的每一次出现都是一个好的开始。

您显然无法复制unique_ptr并且您不想移动它。 通过引用unique_ptr替换允许现有函数体的主体继续工作。

现在有一个陷阱,你必须传递const &以防止被调用者执行unique_ptr.reset()unique_ptr().release() 请注意,这仍然会将可修改的指针传递给设备。 使用此解决方案,您无法轻松地将指针或引用传递给const Device

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM