原始指针和shared_ptr之间的C ++接口

时间:2010-08-15 03:13:09

标签: c++ shared-ptr

我的代码在整个过程中使用原始指针。

需要调用一个将原始指针转换为shared_ptr的方法。 这种方法不在我的控制之下,属于外部api。 我不能只是将指针传递给shared_ptr,因为它将被删除 当shared_ptr超出方法范围时(方法返回时)。

除了在我的内部代码中将原始指针设为shared_ptr之外,我还有其他选择吗?

2 个答案:

答案 0 :(得分:10)

这听起来有点不寻常,可能非常危险,但您可以在构建shared_ptr时使用no-op删除器来实现此目的:

struct no_op_delete
{
    void operator()(void*) { }
};

int* p = 0; // your pointer
std::shared_ptr<int> sp(p, no_op_delete());

sp及其所有副本都被销毁时,将调用no_op_delete来清理保持的指针。由于它什么都不做,你得到了你需要的行为。

答案 1 :(得分:1)

詹姆斯已经回答了这个问题。所以,这只是一个建议。如果您知道函数调用没有修改对象(比如设置一些数据成员等),您可以从原始指针创建一个新对象,并通过shared_ptr将其传递给该函数。这样,您假设该函数获取对象的所有权并执行所需的任何操作。当然,如果函数将修改其中的对象,则这不起作用。如果函数使用对象作为只读来执行某些其他操作(例如文件I / O),则此方法可以正常工作。

相关问题