智能指针
智能指针的类型
- shared_ptr
实现共享式拥有的概念(shared ownership)。多个智能指针指向相同的对象,该对象只有在最后一个引用被销毁后释放。 - weak_ptr
允许共享但是不拥有对象。一旦最后一个拥有该对象的智能指针销毁后,任何的weak_ptr会自动置为空。在default和copy 构造函数之外 ,weak_ptr 只提供 “接受一个 shared_ptr” 的构造函数。 - unique_ptr
是 C++11 才开始提供的类型,是一种在异常时可以帮助避免资源泄漏的智能指针。采用独占式拥有,某个时刻只能有一个unique_ptr指向给定的对象。当unique_ptr被销毁时,它所指向的对象也被销毁。 - auto_ptr
被 c++11 弃用,原因是缺乏语言特性如 “针对构造和赋值” 的 std::move 语义,以及其他瑕疵。
auto_ptr 与 unique_ptr 比较
- auto_ptr 可以赋值拷贝,复制拷贝后所有权转移;unqiue_ptr无拷贝赋值语义,但实现了move语义;
- auto_ptr 对象不能管理数组(析构调用 delete),unique_ptr可以管理数组(析构调用delete[]);
shared_ptr代码简单实现
template <class T> class share_ptr {
private:
class Storage {
private:
int count;
public:
T *pObj;
Storage(T *pObject) {
pObj = pObject;
count = 1;
}
~Storage() {
if (pObj)
delete pObj;
}
void addRef() { count++; }
void remRef() { count--; }
bool noRefs() { return (count == 0); }
};
Storage *storage;
public:
share_ptr(T *pObject) { storage = new Storage(pObject); }
shared_ptr(const shared_ptr &p) {
storage = p.storage;
storage->addRef();
}
~share_ptr() {
storage->remRef();
if (storage->noRefs()) {
delete storage;
}
}
share_ptr &operator=(const share_ptr &p) {
if (this != &p) {
storage->remRef();
if (storage->noRefs()) {
delete storage;
}
storage = p.storage;
storage->addRef();
}
}
T *operator->() { return storage->pObj; }
T &operator*() { return *(storage->pObj); }
};
参考资料
https://github.com/shrddr/Smartpointers/blob/master/shared_ptr.h