11

你好,

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

我从我的一位朋友那里听说智能指针几乎总是可以替换原始指针。但是当我问他还有哪些智能指针不能代替原始指针的情况时,我没有从他那里得到答案。

谁能告诉我他们何时何地不能替换原始指针?

4

7 回答 7

11
  1. 传递指向旧版 API 的指针。
  2. 引用计数树结构中的反向引用(或任何循环情况,就此而言)。这个值得商榷,因为你可以使用弱引用。
  3. 遍历数组。

还有很多情况下您可以使用智能指针但可能不想使用,例如:

  1. 一些小程序旨在泄漏所有内容,因为不值得增加复杂性来弄清楚如何自行清理。
  2. 细粒度的批处理算法(例如解析器)可能会从预先分配的内存池中分配,然后在完成时将整个池吹走。将智能指针指向这样的池通常是没有意义的。
于 2010-04-07T14:19:58.500 回答
3

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

于 2010-04-07T14:20:32.420 回答
3

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

于 2010-04-07T14:24:05.857 回答
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这里使用 a (你得到了expired方法),但是这首先需要使用shared_ptr,你可能不会在你的实现中使用它们。

于 2010-04-07T14:49:29.013 回答
2

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

于 2010-04-07T14:21:12.023 回答
1

如果在某些时候您不使用普通指针,那么实现智能指针将非常困难。

我想用智能指针实现某些数据结构也会更难。例如,释放常规链表的内存非常简单,但要弄清楚拥有和非拥有智能指针的组合以获得相同的结果需要一些思考。

于 2010-04-07T15:12:49.903 回答
1

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

于 2010-04-07T14:21:44.853 回答