jco*_*der 46 c++ smart-pointers unique-ptr
我正试图"现代化"一些现有的代码.
这很好用,但为了"现代化"我的代码,我认为我应该更改要定义的变量,"std::unique_ptr<Device> device_"并删除显式调用delete,这使得代码更安全,通常更好.
我的问题是这个 -
我可以调用.get来获取每个函数调用中的原始指针.但这看起来很丑陋,浪费了一些首先使用unique_ptr的原因.
或者我可以更改每个函数,以便不使用"Device*"类型的参数,而是使用"std :: unique_ptr&"类型的参数.哪个(对我来说)有点模糊了函数原型,并使它们难以阅读.
这是什么最佳做法?我错过了其他选择吗?
Mat*_* M. 44
在Modern C++风格中,有两个关键概念:
所有权是关于某个对象/资源的所有者(在这种情况下,是一个实例Device).各种std::unique_ptr,boost::scoped_ptr或std::shared_ptr关于所有权.
然而,Nullity更简单:它只是表达给定对象是否为null,并且不关心任何其他内容,当然也不关心所有权!
你是正确的移动你的类向实施unique_ptr(一般),虽然你可能想与深拷贝语义的智能指针如果你的目标是实现一个PIMPL.
这清楚地表明,你的班级是唯一负责这段记忆的人,并且巧妙地处理了记忆本可以泄露的各种方式.
另一方面,资源的大多数用户对其所有权不太关心.
只要函数不保持对对象的引用(将其存储在映射或其他内容中),那么重要的是对象的生命周期超过函数调用的持续时间.
因此,选择如何传递参数取决于其可能的Nullity:
jua*_*nza 14
这真的取决于.如果一个函数必须取得unique_ptr的所有权,那么它的签名应该是一个unique_ptr<Device>bv 值,而调用者应该std::move是指针.如果所有权不是问题,那么我将保留原始指针签名并使用指针unique_ptr get().如果有问题的功能不接管所有权,这并不难看.
我会用std::unique_ptr const&.使用非const引用将为被调用函数提供重置指针的可能性.
我认为这是表达被调用函数可以使用指针而不是其他任何东西的好方法.
所以对我来说这将使界面更容易阅读.我知道我不必乱用指针传给我.