careercup-C和C++ 13.8

13.8 编写一个智能指针类。智能指针是一种数据类型,一般用模板实现,模拟指针行为的同时还提供自动垃圾回收机制。它会自动记录SmartPointer<T*>对象的引用计数,一旦T类型对象的引用计数为零,就会释放该对象。

解法:

智能指针跟普通指针一样,但他借助自动化内存管理保证了安全性,避免了诸如悬挂指针、内存泄漏和分配失败等问题。

智能指针必须为给定对象的所有引用维护单一引用计数。主要实现构造函数、复制构造函数和赋值运算符,析构函数。

C++实现代码:

#include<iostream>
#include<cstdlib>
#include<new>
using namespace std;

template <typename T>
class SmartPointer
{
public:
    SmartPointer(T* ptr)
    {
        ref=ptr;
        ref_count=(unsigned*)malloc(sizeof(unsigned));
        *ref=1;
    }
    SmartPointer(SmartPointer<T> &sptr)
    {
        ref=sptr.ref;
        ref_count=sptr.ref_count;
        ++(*ref_count);
    }
    SmartPointer<T> &operator=(SmartPointer<T> &sptr)
    {
        if(this==&sptr) return *this;
        if(*ref_count>0)
        {
            remove();
        }
        ref=sptr.ref;
        ref_count=sptr.ref_count;
        ++(*ref_count);
        return *this;
    }
    ~SmartPointer()
    {
        remove();
    }

    T getValue()
    {
        return *ref;
    }
protected:
    void remove()
    {
        --(*ref_count);
        if(*ref_count==0)
        {
            delete ref;
            free(ref_count);
            ref=NULL;
            ref_count=NULL;
        }
    }
private:
    T* ref;
    unsigned *ref_count;
};

int main()
{
    int *p1=new int();
    *p1=1111;
    int *p2=new int();
    *p2=22222;
    SmartPointer<int> sp1(p1),sp2(p2);
    SmartPointer<int> spa=sp1;
    sp2=spa;
}
原文地址:https://www.cnblogs.com/wuchanming/p/4157368.html