【问题标题】:C++ interface between raw pointers and shared_ptr原始指针和 shared_ptr 之间的 C++ 接口
【发布时间】:2010-08-15 11:47:14
【问题描述】:

我的代码始终使用原始指针。

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

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

【问题讨论】:

  • 为什么你的代码始终使用原始指针?
  • 这不是我的代码。它是我现在拥有/维护的公司代码。在整个过程中移动指向 shared_ptrs 的指针是一个值得的目标吗?意见?
  • @user:取决于你的情况。如果您可以使代码更安全、更快、更简洁,并且有时间去做,那么您应该修复所有代码。但有时你只需要使用你所拥有的东西,并从那里改进它。换句话说,专注于你需要完成的事情,以及当你有时间修复和升级旧的、损坏的代码时。 (当然,除非你不能继续因为代码被原始指针破坏,然后显然修复它。)

标签: c++ shared-ptr


【解决方案1】:

这听起来有些不寻常,并且可能非常危险,但您可以通过在构造 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 来清理持有的指针。因为它什么都不做,所以你得到了你需要的行为。

【讨论】:

  • James McNellis 从不睡觉 xD。
  • @Prasoon:睡觉只是浪费我本来可以花在编程上的时间。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-09-07
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多