2010-08-15 153 views
4

我有遍历使用原始指针的代码。原始指针和shared_ptr之间的C++接口

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

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

+0

为什么您的代码在整个过程中都使用原始指针? – GManNickG 2010-08-15 05:40:31

+0

它不是我的代码。它是我现在拥有/维护的公司代码。整个移动指向shared_ptrs的指针是否值得?意见? – user231536 2010-08-15 21:56:17

+0

@user:取决于你的情况。如果您可以使代码更安全,更快速,更清洁,并且有时间,那么您应该修复所有代码。但是有时候你只需要用你拥有的东西来运行,并从那里改进它。换句话说,关注你需要完成什么,以及何时有时间修复和升级旧的破坏代码。 (当然,除非你不能继续*因为*代码被原始指针破坏,那么显然修复它。) – GManNickG 2010-08-16 05:34:43

回答

10

这听起来有点不寻常,可能是相当危险的,但你可以通过构建shared_ptr在使用无操作缺失者做到这一点:

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将被调用来清理保存的指针。既然它什么都不做,你会得到你需要的行为。

+0

詹姆斯麦克奈利斯从不睡觉xD。 – 2010-08-15 03:38:19

+0

@Prasoon:睡眠只是浪费时间,否则我可以花费编程。 – 2010-08-15 03:40:20

+0

呵呵,那么你应该阅读http://serendip.brynmawr.edu/exchange/node/1690 :-) – 2010-08-15 03:51:25

1

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

相关问题