我正在尝试“现代化”一些现有代码。
- 我有一个类,目前有一个成员变量“Device * device_”。
- 在某些初始化代码中,它使用new创建实例,并在析构函数中使用“delete device_”。
- 该类的成员函数调用许多需要Device *作为参数的其他函数。
这个方法很好,但为了“现代化”我的代码,我认为我应该将变量定义为“std :: unique_ptr< Device > device_”,并删除对delete的显式调用,这样可以使代码更安全,更好。
我的问题是 -
- 然后我应该如何将device_变量传递给所有需要它作为参数的函数?
我可以在每个函数调用中调用.get来获取原始指针。但是这似乎很丑陋,并且浪费了使用unique_ptr的一些原因。
或者我可以更改每个函数,使其不再采用“Device *”类型的参数,而是采用“std :: unique_ptr& ”类型的参数。这使得函数原型有点难以理解,并难以阅读。
这种情况下的最佳实践是什么?我错过了其他选项吗?
unique_ptr
的真正安全在于,您不需要将指针用 try 块括起来以确保在出现异常情况下将其删除。这意味着,除非在构造函数中有特定的限制条件,否则它在具有析构函数的对象中并不能提供太多帮助。(无论您是在析构函数中放置 delete,还是使用unique_ptr
,在需要记住要做什么方面,差别不大。) - James Kanzestd::unique_ptr
来解决问题。这只会增加复杂性和混淆。在更复杂的情况下,这取决于具体情况。大多数情况下,更清晰的解决方案是委托给一个负责处理这个对象的基类。(std::vector
的 g++ 实现就是一个很好的例子。)在其他情况下,使用unique_ptr
成员可能是有意义的,但根据我的经验,它们并不常见。 - James Kanze