scoped_ptr
scoped_ptr正如其字面意思 scoped:作用域
scoped_ptr只实现了智能指针的通用特性:栈管理堆
当超出当前作用域时,scoped_ptr释放指向的对象.
scoped_ptr的实现
智能指针的大致原理:
智能指针内部都会保存一个指向保存对象的指针
调用reset或构造时,指针指向一个对象
调用release或超出作用域(即自动析构),指针不再指向对象(析构时还会delete释放掉指向的对象)
template <class C>
class scoped_ptr {
public:
explicit scoped_ptr(C* p = NULL) : ptr_(p) { } //构造时内部指针指向对象
~scoped_ptr() {
enum { type_must_be_complete = sizeof(C) }; //防止C的不完全声明
delete ptr_; //析构时释放对象
void reset(C* p = NULL) { //reset时并不释放对象 仅仅使指针不再指向原先的对象
if (p != ptr_) {
enum { type_must_be_complete = sizeof(C) };
delete ptr_;
ptr_ = p;
}
//重载*和->
C& operator*() const {
assert(ptr_ != NULL);
return *ptr_;
}
C* operator->() const {
assert(ptr_ != NULL);
return ptr_;
}
C* get() const { return ptr_; } //get获取指向保存的对象的指针
C* release() { //release时不释放对象 仅改变内部指针的指向.
C* retVal = ptr_;
ptr_ = NULL;
return retVal;
}
}
private:
C* ptr_;
};