在以下代码段中,是否有需要考虑的警告?
void do_stuff()
{
std::unique_ptr<my_type> my(new my());
my_type& mine = *my;
//use mine
}
通过取消引用隐式指针来“突显”我的价值给了我一种奇怪的感觉,因为它感觉它会创建一个临时的(但我很确定不是这样)
答案 0 :(得分:3)
在保持对象的引用(或指针)时,代码可以正常注意:您必须确保该对象比指针或引用的使用寿命更长。
在这种特殊情况下,请确保通过调用unique_ptr
或reset()
来删除delete my.release();
中的对象,我认为这是唯一的生命周期该引用可能比对象本身的寿命更长。
旁注:我假设你有充分的理由为该对象使用动态分配。如果您不确定,请考虑不首先使用指针/ new。
我也假设 performance 没有引用,如果是,你可能想要通过引用考虑访问,否则智能指针将被转换为完全相同的二进制文件。
答案 1 :(得分:0)
除了没有多大意义(至少在代码片段中)代码没有问题,如果my
的构造和引用的赋值之间确实没有任何内容。
答案 2 :(得分:0)
确保指针超过(使用)引用。
一种简单的方法是使用 const
:
void doStuff()
{
auto const p = std::unique_ptr<MyType>( new MyType );
MyType& m = *p;
// use m
}
当然,如果没有任何特殊原因需要动态分配(例如大小或特殊分配器),那么只需对MyType
对象使用自动分配,即声明它直接作为局部变量而不使用单词static
。