2015-09-23 24 views
3

我有,需要一个指针的指针,并填补了值的函数:填充的std ::后来的unique_ptr

void GetSensor(Sensor **sensor); 

通常情况下,我必须这样做以创建传感器和无它:

Sensor *sensor; 
GetSensor(&sensor); 
// Do something with the sensor 
delete sensor; 

现在我想为同一个任务使用std :: unique_ptr。我知道我能做到这一点:

std::unique_ptr<Sensor> safe_sensor; 
Sensor *sensor; 
GetSensor(&sensor); 
safe_sensor.reset(sensor); 
// Do something with the sensor 
// safe_sensor will free the sensor pointer 

我可以以某种方式避免与临时传感器变量步骤?这会工作吗?

std::unique_ptr<Sensor> safe_sensor; 
GetSensor(&safe_sensor.get()); 
// Do something with the sensor 
// Will the free work correctly here? 
+2

'unique_ptr :: get'返回一个指针,不是对指针的引用 –

+0

@Angew:不,不是故意的。应该修复 –

+0

@PiotrSkotnicki你是对的...我想这就是其中一个问题。 –

回答

7

最简单的就是包装你的代码放到一个函数:

std::unique_ptr<Sensor> make_safe_sensor() 
{ 
    Sensor *sensor; 
    GetSensor(&sensor); 
    return std::unique_ptr<Sensor>(sensor); 
} 

std::unique_ptr不给访问参考到它所属的指针。

+1

不是我的问题的答案,因为临时变量仍然在这里......这个解决方案需要比最初的例子更多的代码... –

+0

要结束悬念,我会强调上面答案中的最后一行 - “std :: unique_ptr不允许访问对其拥有的指针的引用。“即答案是“不,你不能”。如果你更喜欢它,你可以通过调用使自己的行为有一些未定义的行为:GetSensor(&(Sensor *&)((char *&)(safe_sensor)));依赖于内部的unique_ptr的第一个字节是std :: tuple <指针,deleter>即元组的第一个成员是指针:DI永远不会使用它,但它编译和运行看起来简单的传感器结构确定OK –

+1

@JanRüeggWhile确实它是“更多的代码”,它现在是更安全的代码,因为你不再直接使用不安全的'GetSensor'调用,而是始终使用'make_safe_sensor'函数。现在,如果您可以更改'GetSensor',以便它返回一个'std :: unique_ptr'而不是采用双指针,那么您将会做出更好的改进。 –