相较于使用原始指针所采用的一些高级技术(但不仅限于此),每种智能指针的等效用法是什么?
我的理解很少,但从我所了解到的:
- 原始指针:只有在您确实非常非常非常非常地知道自己在做什么并已经在接口后小心隐藏了用法时才使用。
- std::auto_ptr:已过时,不要使用。
- std::unique_ptr:单例指针,通过赋值转移所有权。
- std::shared_ptr:引用计数指针,在分配时不会转移所有权,但会增加其引用计数。当所有引用离开范围或明确调用
std::shared_ptr::reset
时,将调用底层的deallocater
。 - std::weak_ptr:
std::shared_ptr
的子类型,不会增加引用计数,并在其父std::shared_ptr
不存在时无效。可能返回无效引用。在使用之前请务必检查。
等效的原始指针示例
引用计数、缓存实现:std::map<std::string, std::pair<long, BITMAP*> > _cache;
具有所有权转移的单例:
class Keyboard {
public:
//...
static Keyboard* CreateKeyboard();
~Keyboard();
//...
private:
//...
Keyboard();
static Keyboard* _instance;
//...
};
聚合容器,无所有权:空间分割图和树,迭代容器等。
组合容器,有所有权:大型对象。
-- 编辑--
在我的工作中,我遇到了一个有趣的情况,DeadMG指出智能指针应该被用作易于抽象的资源管理工具; 那么对于不能在声明时在堆上创建,而必须在稍后时间创建的文件范围对象呢?
unique_ptr
称为单例指针,我怀疑你在这里对单例有完全不同的理解。 - Puppystd::shared_ptr
的一对多。 - Casey