C ++

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

  • 我有一个目前有一个成员变量“Device * device_”的类。
  • 它使用new在一些初始化代码中创建一个实例,并在结构中有一个“delete device_”。
  • 这个类的成员函数调用许多其他将Device *作为参数的函数。
  • 这很好,但为了“代码化”代码,我认为我应该将变量定义为"std::unique_ptr<Device> device_"并删除显式调用,这会使代码更安全,更好。

    我的问题是这个 -

  • 那么我该如何将device_变量传递给所有需要它作为参数的函数呢?
  • 我可以调用.get来获取每个函数调用中的原始指针。 但是这看起来很丑并且首先浪费了使用unique_ptr的一些原因。

    或者我可以更改每个函数,以便不用参数类型“Device *”,而是使用“std :: unique_ptr&”类型的参数。 哪些(对我)有点混淆函数原型,并使其难以阅读。

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


    在现代C ++风格中,有两个关键概念:

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

    然而,Nullity更简单:它只是表示给定对象是否可能为空,并不关心其他任何事情,当然也不关心所有权!


    如果你的目标是实现一个PIMPL,你可能需要一个带有深层复制语义的智能指针,这是将你的类的实现移向unique_ptr (一般情况)是正确的。

    这清楚地表明,你的班级是唯一对这段记忆负责的人,并且整洁地处理记忆可能以其他方式泄漏的各种方式。


    另一方面,这些资源的大多数用户并不在乎它的所有权。

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

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

  • 永不为空? 通过参考
  • 可能为空? 传递一个指针,一个简单的裸指针或一个类指针类(例如,一个陷阱为null)


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


    我会使用std::unique_ptr const& 。 使用非const引用将使被调用的函数可以重置指针。
    我认为这是一种很好的方式来表达你的被调用的函数可以使用指针,但没有别的。
    所以对我来说,这将使界面更易于阅读。 我知道,我不必用指针传递给我。

    链接地址: http://www.djcxy.com/p/59671.html

    上一篇: c++

    下一篇: ptr be used safely in stl collections?