删除文章

确定要删除这篇文章吗?

取消
确定

C++ 智能指针简单实现

     阅读(123)  2019-08-05 14:02:06

此实现仅做学习之用,生产中不要使用,可以使用std::shared_ptr和boost::shared_ptr。 代码很少相信大家都看得懂。

template<class T>
class SmartPtr
{
    struct Counter {
        Counter() : count(1){}
        int count;
    };

public:
    SmartPtr(): c_(NULL), p_(NULL) {}
    explicit SmartPtr(T *p) : c_(new Counter()), p_(p) {}
    SmartPtr(const SmartPtr &p) : c_(p.c_), p_(p.p_){ inc(); }
    SmartPtr& operator=(const SmartPtr &p) {
        if (this != &p) {
            dec();
            c_ = p.c_;
            p_ = p.p_;
            inc();
        }
        return *this;
    }
    ~SmartPtr() { dec(); }
    T* operator->() const { return p_; }
    T& operator*() const { return *p_; }
    operator bool() const { return !!p_; }
    bool operator!() const { return !p_; }
    T* get() const { return p_; }

private:
    void inc() {
        if (c_) {
            c_->count++;
        }
    }
    void dec() {
        if (c_ && --c_->count == 0) {
            delete p_;
            delete c_;
        }
    }
private:
    Counter *c_;
    T* p_;
};

测试:

class Widget {
public:
    Widget()
    {
        std::cout << "Widget\n";
    }
    ~Widget()
    {
        std::cout << "~Widget\n";
    }
    void show()
    {
        std::cout << "show\n";
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    {
        SmartPtr<Widget> p4;
        {
            SmartPtr<Widget> p(new Widget());
            SmartPtr<Widget> p2(new Widget());
            SmartPtr<Widget> p3 = p;
            p3->show();
            p2 = p3;
            p2->show();
            p4 = p2;
        }
        if (p4) {
            p4->show();
            p4.get()->show();
        }
    }

    system("pause");
    return 0;
}

文章评论

Keep it simple,stupid
文章数
300
总访问量
444227
今日访问
565
最近评论

xuehaoyun : 很不错,来围观一下
tujiaw : 抱歉csdn code服务关闭了,这个代码我也找不到了
于淞 : 你好,这个文章的源码能分享一下吗,songsong9181@163.com,谢谢了 上面的写错了
于淞 : 你好,这个文章的源码能分享一下吗,838106303@163.com,谢谢了 上面的链接不能用了
tujiaw : 多谢多谢
essaypinglun college-paper.org : 很好的博客,赞赞
Folly : 这个实现有点奇怪,Qt为什么没有统一的比对方法。
过多s : alert("hello, world!")
tujiaw : 还不错哦
回到顶部