填充std::unique_ptr

3

我有一个函数,它接受一个指向指针的指针,并填充值:

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 返回一个指针,而不是指向指针的引用。 - Piotr Skotnicki
@Angew:不,这不是故意的。应该已经修复了。 - Jan Rüegg
@PiotrSkotnicki 你说得对... 我想那可能是其中一个问题。 - Jan Rüegg
1个回答

7
最简单的方法是将您的代码封装成一个函数:
std::unique_ptr<Sensor> make_safe_sensor()
{
    Sensor *sensor;
    GetSensor(&sensor);
    return std::unique_ptr<Sensor>(sensor);
}

std::unique_ptr无法访问其拥有指针的引用。


1
这并不是我的问题的答案,因为临时变量仍然存在...这个解决方案需要比最初的示例更多的代码... - Jan Rüegg
为了结束悬念,我强调上面答案中的最后一行 - “std::unique_ptr不提供对其拥有指针的引用。”也就是说,答案是“不行”。如果你喜欢,你可以通过调用GetSensor(&(Sensor*&)((char*&)(safe_sensor)))来制造一些未定义的行为,这取决于unique_ptr的前几个字节是std::tuple<pointer, deleter>,即元组的第一个成员是指针:D 我永远不会使用它,但它编译并运行起来似乎还不错,只要简单的Sensor结构体。 - user2026095
1
@JanRüegg 虽然代码量增加了,但是现在它是更安全的代码,因为你不再直接使用那个不安全的 GetSensor 调用,而总是使用这个 make_safe_sensor 函数。如果你可以改变 GetSensor,使其返回一个 std::unique_ptr 而不是取一个双指针,那么你将会做出更好的改进。 - Andre Kostur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接