美文网首页
sharedptr的简单实现

sharedptr的简单实现

作者: sych | 来源:发表于2018-04-14 21:07 被阅读0次

介绍

标准库中的sharedptr简化了内存管理,其内部使用了引用计数,当计数为0的时候就释放内存。

  • 当发生拷贝构造的时候,计数器自增1;
  • 当发生拷贝赋值的时候,操作符=左侧运算对象的计数器自减1,右侧的运算对象计数器自增1。
  • sharedptr析构的时候计数器自减1, 不会直接释放所管理的内存,而是先判断计数器是否为0,只有计数器为0的时候才释放所管理的内存空间。

实现

template<typename T>
class SharedPointer
{
public:
    SharedPointer(T *);
    SharedPointer &operator=(const SharedPointer<T> &);
    SharedPointer(const SharedPointer<T> &);
    ~SharedPointer();
    inline T* get() const
    {
        return obj;
    }
private:
    T *obj;
    size_t *counter;
};
template<typename T>
SharedPointer<T>::SharedPointer(T *t): obj(t), counter(new size_t(1))
{
    cout << "call sharedptr's constructer: counter = " << *counter << endl;
}

// 拷贝构造,共享计数器和管理对象指针。
template<typename T>
SharedPointer<T>::SharedPointer(const SharedPointer &ptr)
{
    counter = ptr.counter;
    obj = ptr.obj;
    *counter += 1;
    cout << "call sharedptr's copy constructer: counter = " << *counter << endl;
}
// 拷贝赋值,运算符左侧对象计数器自减1,右侧对象计数器自增1
// 如果左侧对象计数器为0,释放内存 
template<typename T>
SharedPointer<T>& SharedPointer<T>::operator= (const SharedPointer<T> &ptr)
{
    *ptr.counter += 1;
    *counter -= 1;
    if (counter == 0)
    {
        delete counter;
        delete obj;
    }
    obj = ptr.obj;
    counter = ptr.counter;
    cout << "call sharedptr's operator: counter = " << *counter << endl;
    return *this;
}
template<typename T>
SharedPointer<T>::~SharedPointer()
{
    *counter -= 1;
    cout << "call sharedptr's desconstructer: counter = " << *counter << endl;
    if (*counter == 0)
    {
        delete counter;
        delete obj;
    }
}

相关文章

  • sharedptr的简单实现

    介绍 标准库中的sharedptr简化了内存管理,其内部使用了引用计数,当计数为0的时候就释放内存。 当发生拷贝构...

  • JavaScript简单实现栈

    JavaScript简单实现栈主要是通过数组实现,以下是简单实现的代码

  • rxjs - i18n

    目的 实现网页多语言的切换 依赖 react,rxjs,useObservable感觉就是简单,简单,简单 实现 ...

  • 超简单实现iOS列表的索引功能

    超简单实现iOS列表的索引功能 超简单实现iOS列表的索引功能

  • 简单实现下拉图片放大④ + pageControl指示器

    传送门 : 简单实现下拉图片放大① - 全屏手势简单实现下拉图片放大② - 单张图简单实现下拉图片放大③ - 定时...

  • 实现简单的Promise

    参考文章:Promise不会??看这里!!!史上最通俗易懂的Promise!!!

  • 实现简单的弹幕

    第一步,首先要在Android的build.gradle文件中引入B站的项目: repositories { ...

  • 拖拽的简单实现

    前言:年初换工作,换住处弄了好长一段时间,终于全部搞定了,好久没写博客了,今天小更新一下,以示存在 ~.~ 话不多...

  • lazyload的简单实现

  • Promise的简单实现

    MyPromise的简单伪实现 Promise对象表示一个异步操作的最终结果,用来传递异步传输的数据。实现Prom...

网友评论

      本文标题:sharedptr的简单实现

      本文链接:https://www.haomeiwen.com/subject/vxkrkftx.html