智能指针

当指针作为类成员时,指针成员的复制将使两个实例的指针成员均指向同一地址,将其中一个指针释放时,其他实例中的指针将会变为悬垂指针。使用智能指针类可以控制此情况的发生。

其原理是控制指针成员的删除,只有被引用对象无任何实例使用时,才会被彻底删除。智能指针类主要通过引用计数来控制被引用对象。

以下给出一个示例方案。

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;
}