你好,
我有这个关于智能指针的查询。
我从我的一位朋友那里听说智能指针几乎总是可以替换原始指针。但是当我问他还有哪些智能指针不能代替原始指针的情况时,我没有从他那里得到答案。
谁能告诉我他们何时何地不能替换原始指针?
你好,
我有这个关于智能指针的查询。
我从我的一位朋友那里听说智能指针几乎总是可以替换原始指针。但是当我问他还有哪些智能指针不能代替原始指针的情况时,我没有从他那里得到答案。
谁能告诉我他们何时何地不能替换原始指针?
还有很多情况下您可以使用智能指针但可能不想使用,例如:
将从 C 调用的 API 就是一个明显的例子。
取决于您使用的智能指针。std::auto_ptr 与 STL 容器不兼容。
这是语义问题:
例如:
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
,你可能不会在你的实现中使用它们。
与遗留代码的交互。如果 api 需要一个原始指针,您需要提供一个原始指针,即使一旦它在您的代码中,您将它包装在一个智能指针中。
如果在某些时候您不使用普通指针,那么实现智能指针将非常困难。
我想用智能指针实现某些数据结构也会更难。例如,释放常规链表的内存非常简单,但要弄清楚拥有和非拥有智能指针的组合以获得相同的结果需要一些思考。
如果您遇到原始指针因某种原因被强制转换为 intptr_t 并返回的情况,它不能被智能指针替换,因为强制转换操作会丢失智能指针中包含的任何引用计数信息。