我的代码在整个过程中使用原始指针。
需要调用一个将原始指针转换为shared_ptr的方法。 这种方法不在我的控制之下,属于外部api。 我不能只是将指针传递给shared_ptr,因为它将被删除 当shared_ptr超出方法范围时(方法返回时)。
除了在我的内部代码中将原始指针设为shared_ptr之外,我还有其他选择吗?
答案 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),则此方法可以正常工作。