HI,
我有关于智能指针的查询。
我从一位朋友那里听说智能指针几乎总能取代原始指针。 但当我问他智能指针无法取代原始指针的其他情况时,我没有得到他的答案。
任何人都可以告诉我他们何时何地无法取代原始指针?
答案 0 :(得分:11)
在许多情况下,您可以使用智能指针,但可能不想,例如:
答案 1 :(得分:3)
将从C调用的API将是一个明显的例子。
答案 2 :(得分:3)
取决于您使用的智能指针。 std :: auto_ptr与STL容器不兼容。
答案 3 :(得分:3)
这是语义问题:
例如:
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)
如果在某些时候你不使用普通指针,那么实现智能指针会很困难。
我认为用智能指针实现某些数据结构也会更困难。例如,释放常规链表的记忆是非常简单的,但是需要花些时间来弄清楚拥有和非拥有智能指针的组合以获得相同的结果。