智能指针 - 无法替换原始指针的情况

时间:2010-04-07 14:17:13

标签: c++ smart-pointers

HI,

我有关于智能指针的查询。

我从一位朋友那里听说智能指针几乎总能取代原始指针。 但当我问他智能指针无法取代原始指针的其他情况时,我没有得到他的答案。

任何人都可以告诉我他们何时何地无法取代原始指针?

7 个答案:

答案 0 :(得分:11)

  1. 将指针传递给旧版API。
  2. 引用计数树结构中的反向引用(或任何循环情况,就此而言)。这个问题值得商榷,因为你可以使用弱参考。
  3. 迭代数组。
  4. 在许多情况下,您可以使用智能指针,但可能不想,例如:

    1. 一些小程序旨在泄露一切,因为它不值得增加复杂性,找出如何清理自己。
    2. 细粒度批处理算法(如解析器)可能会从预先分配的内存池中分配,然后在完成时将整个池清除掉。智能指针进入这样的池通常是没有意义的。

答案 1 :(得分:3)

将从C调用的API将是一个明显的例子。

答案 2 :(得分:3)

取决于您使用的智能指针。 std :: auto_ptr与STL容器不兼容。

答案 3 :(得分:3)

这是语义问题:

  • 智能指针:你拥有(至少部分)指向的内存,因此负责释放它
  • 常规指针:给你一个对象的句柄......或不给(NULL)

例如:

class FooContainer
{
public:
  typedef std::vector<Foo> foos_t;

  foos_t::const_iterator fooById(int id) const; // natural right ?
};

但是你在这里公开了一些实现细节,你可以完美地创建自己的迭代器类......但是迭代器通常意味着可递增等...或者使用指针

class FooContainer
{
public:
  const Foo* fooById(int id) const;
};

可能它将返回NULL,表示失败,或者它将返回指向对象的指针,您不必为此处理内存。

当然,你也可以在这里使用weak_ptr(你得到expired方法),但是首先需要使用shared_ptr而你可能不会在你的实施。

答案 4 :(得分:2)

与遗留代码的互动。如果api需要一个原始指针,你需要提供一个原始指针,即使它在你的代码中已经将它包装在一个智能指针中。

答案 5 :(得分:1)

如果你有一个将原始指针强制转换为intptr_t并由于某种原因返回的情况,它不能被智能指针替换,因为转换操作会丢失智能指针中包含的任何引用计数信息。

答案 6 :(得分:1)

如果在某些时候你不使用普通指针,那么实现智能指针会很困难。

我认为用智能指针实现某些数据结构也会更困难。例如,释放常规链表的记忆是非常简单的,但是需要花些时间来弄清楚拥有和非拥有智能指针的组合以获得相同的结果。