智能指针
当指针作为类成员时,指针成员的复制将使两个实例的指针成员均指向同一地址,将其中一个指针释放时,其他实例中的指针将会变为悬垂指针。使用智能指针类可以控制此情况的发生。
其原理是控制指针成员的删除,只有被引用对象无任何实例使用时,才会被彻底删除。智能指针类主要通过引用计数来控制被引用对象。
以下给出一个示例方案。
class HasPtr;
// 定义计数类
class U_ptr {
friend class HasPtr;
int *ip;
std::size_t use;
U_ptr(int *p): ip(p), use(1) {};
~U_ptr() { delete ip; }
}
// 使用计数类
class HasPtr {
public:
HasPtr(int *p, int i): ptr(new U_ptr(p)), val(i) {}
HasPtr(const HasPtr& origin): ptr(origin.ptr), val(origin.val) { ++ ptr->use; } // 此处进行复制控制
HasPtr& operator=(const HasPtr&);
~HasPtr() { if (-- ptr=>use == 0) delete ptr; }
private:
U_ptr *ptr;
int val;
}