实现类似shared_ptr的引用计数

13.27 定义使用引用计数版本的HasPtr

#include<iostream>
#include<string>
#include<new>

using namespace std;
class HasPtr
{
public:
    HasPtr(const string &s=string()):ps(new string(s)),i(0),use(new size_t(1)) {cout<<"constructer"<<endl;}
    HasPtr(const HasPtr &h):i(h.i)
    {
        cout<<"copy constructer"<<endl;
        ps=h.ps;
        ++*h.use;
        use=h.use;
    }
    HasPtr& operator=(const HasPtr &h)
    {
        ++*h.use;
        //将原来分配的内存空间删除
        while(--*use==0)
        {
            delete ps;
            delete use;
        }
        //指向新的内存空间
        ps=h.ps;
        i=h.i;
        use=h.use;
        return *this;
    }
    //如果在赋值操作中删除了左边对象的内存空间,则此处调用析构函数时将不再删除内存空间,但是该对象还是会被析构
    ~HasPtr()
    {
        if(--*use==0)
        {
            delete ps;
            delete use;
        }
        cout<<"destructer"<<endl;
    }
private:
    string *ps;
    int i;
    size_t *use;
};
int main()
{
    HasPtr h;
    HasPtr hh(h);
    hh=h;
    return 0;
}

实现类似shared_ptr的引用计数,布布扣,bubuko.com

时间: 2024-11-08 02:10:59

实现类似shared_ptr的引用计数的相关文章

shared_ptr循环引用&定置删除器

shared_ptr虽然方便,但是它有着一个致命的缺陷就是循环引用问题,因为shared_ptr本身并没有能力解决这个问题,所以我们又引入了弱指针weak_ptr来辅助shared_ptr解决这个问题. 那么循环引用又是什么场景? 举个栗子: 假设现在我们要创建一个双向整形链表,但是这个链表的指针域全部都用shared_ptr维护: struct Node { int _data; shared_ptr<Node> _next; shared_ptr<Node> _prev; }

引用计数智能指针

<a>C++ <span style="font-family:宋体;">智能指针具体解释</span></a> 一.简单介绍 因为 C++ 语言没有自己主动内存回收机制.程序猿每次 new 出来的内存都要手动 delete. 程序猿忘记 delete.流程太复杂.终于导致没有 delete.异常导致程序过早退出,没有运行 delete 的情况并不罕见. 用智能指针便能够有效缓解这类问题,本文主要解说參见的智能指针的使用方法.包含:std

[转] weak_ptr解决shared_ptr环状引用所引起的内存泄漏

http://blog.csdn.net/liuzhi1218/article/details/6993135 循环引用: 引用计数是一种便利的内存管理机制,但它有一个很大的缺点,那就是不能管理循环引用的对象.一个简单的例子如下: #include<string> #include <iostream> #include <boost/shared_ptr.hpp> #include <boost/weak_ptr.hpp> class parent; cl

智能指针的模拟实现shared_ptr 循环引用 定置删除器

auto_ptr与scoped_ptr的实现见本人的上篇博客. 三.shared_ptr shared_ptr的实现原理是通过引用计数来实现,只有当引用计数为1时才释放空间,否则只需将引用计数减1.拷贝和赋值将引用计数加1,具体代码如下: template <typename T> class SharedPtr { public: SharedPtr(); SharedPtr(T* ptr); SharedPtr(const SharedPtr<T>& ap); ~Sha

boost的shared_ptr循环引用

boost的智能指针给编程带来了极大的便利,不需要关心内存的释放,不要要调用delete,而且还可以定制delete的方法.其实boost的智能指针是可以当成scope_exit来用的,同样是退出时处理.但是凡事都是有利有弊,boost的shared_ptr如果在循环引用的时候会出现无法释放内存的情况,所谓循环引用就是A智能指针类里存放B的智能指针,B的智能指针类里存放A,将a.b的值互相设置.增加引用计数,在释放的时候由于计数问题,会导致在退出指针域的时候无法进行释放,解决该问题的方案是在类成

进击的雨燕--------------自动引用计数

Swift 使用自动引用计数(ARC)机制来跟踪和管理你的应用程序的内存.通常情况下,Swift 内存管理机制会一直起作用,你无须自己来考虑内存的管理.ARC 会在类的实例不再被使用时,自动释放其占用的内存. 然而,在少数情况下,ARC 为了能帮助你管理内存,需要更多的关于你的代码之间关系的信息.本章描述了这些情况,并且为你示范怎样启用 ARC 来管理你的应用程序的内存. 注意:引用计数仅仅应用于类的实例.结构体和枚举类型是值类型,不是引用类型,也不是通过引用的方式存储和传递. 自动引用计数的工

CString是否使用了引用计数

Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源 问题: CString是否使用了引用计数? 答案是肯定的.平常使用的时候确实没有查觉这方面,包括我们可以把CString强制转为TCAHR*来使用,效果也都正常. CString强制转为TCAHR*为什么能正常,原因是什么呢? 原因是单纯从数据结构上来看,它仅有一个变量: m_pszData 但它动态申请的内存结构是这样的 [CStringData结构][存储字符串] 而m_pszData

Python内存管理及引用计数

作为一门动态语言,python很重要的一个概念就是动态类型,即对象的类型和内存占用都是运行时确定的.(Why?)运行时,解释器会根据语法和右操作数来决定新对象的类型.动态类型的实现,是通过引用和对象的分离达到的.对象是存放在内存中的数据实体,而引用(reference)可以理解成一个封装好的指向对象的指针.不过操作更加方便和安全.就像C++中的引用是对指针操作的简化和封装一样.在python中,内存的管理,即分配与回收,都是由python解释器来做的,程序员不需要关心太多.或者,也可以把引用理解

自动引用计数

http://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/chapter2/16_Automatic_Reference_Counting.html 本页包含内容: 自动引用计数的工作机制 自动引用计数实践 类实例之间的循环强引用 解决实例之间的循环强引用 闭包引起的循环强引用 解决闭包引起的循环强引用 Swift 使用自动引用计数(ARC)这一机制来跟踪和管理你的应用程序的内存.通常情况下,Swift 的内存管理机