码迷,mamicode.com
首页 > 其他好文 > 详细

垃圾回收器设计

时间:2016-06-05 23:01:19      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

1利用栈对象自动释放(可以禁止析构函数就不能产生栈对象了哦 小技巧)
利用栈对象出作用域自动释放的特性构造一个空的智能指针类
 
2解决智能释放问题,只要这样就不用手工delete类指针了
在智能指针类的析构函数里面delete对象成员去对象里面释放垃圾指针等..
 
3解决被智能指针代理的真实对象的函数的调用问题
重载->运算符,以便能直接调用这个智能指针存储的对象中的函数
或者使用代理模式不过没有重载的方法简单
 
4继承引用计数类,来为自身增加引用技术功能,
引用计数的++ --在智能指针里完成
 
#include <iostream>
#include <string.h>
using namespace std;
/* 智能指针垃圾回收器 */
 
class CMyString;
 
class CRefCount{
    public:
        //共享实值 新增加对象
        CRefCount(CMyString* realPtr):mCount(0),mPMyString(0){
            if(realPtr!=NULL){
                mPMyString=realPtr;
            }
        }
        virtual ~CRefCount(){
            
            delete mCount;
        }
        void addRefenceCount(){
            if(mCount==NULL){
                mCount=new int(0);
            }
            ++(*mCount);
        }
 
        int subRefenceCount(){
            /* 0没有对象共享实值mBuf 那么就可以把这片空间释放掉  此时this的虚析构函数 被派生类覆盖所以先掉的派生类*/
           if((--(*mCount))==0){
                delete this;
                return 0;
           }
           return *mCount;
        }
    private:
        int* mCount;
        CMyString* mPMyString;
};
 
class CMyString:public CRefCount{
public:
    CMyString(char* str):CRefCount(this){
        char* p=new char[strlen(str)+1];
        mBuf=p;
        ::strcpy(mBuf,str);
    }
    /* 
     虚析构方便调用,有继承关系时候方便派生类转基类指针自动调用基类的析构,虚析构会先给
     虚表赋值,所以当前虚表调用的就是自己的虚函数喽,调完紧接着调用基类的虚函数
    */
    virtual ~CMyString(){
        if(mBuf!=NULL){
            delete mBuf;
        }
    }
    void fun1(){
        cout<<"hello smart"<<endl;
    }
private:
    char* mBuf;
};
 
class CSmartPtr{
public:
    explicit CSmartPtr(CMyString* ptr=NULL){
        mObject=ptr;
        if(ptr!=NULL){
            ptr->addRefenceCount();
        }
    }
    CSmartPtr(CSmartPtr& obj){
        mObject=obj.mObject;
        mObject->addRefenceCount();
    }
    ~CSmartPtr(){
        if(mObject!=NULL){
            mObject->subRefenceCount();
        }
    }
    /* 重载-> 返回被代理的对象的指针,在调用就是真实的对象指针了 
      其实应该是->->这样但是c++编译器给你完成了可以直接一个->搞定两步
    */
    CMyString* operator->(){
        return mObject;
    }
    /*等于产生一个新对象,默认加入共享实值*/
    CSmartPtr& operator=(const CSmartPtr& obj){
        //释放原来的计数
        if (mObject != NULL)
            mObject->subRefenceCount();
        
        mObject = obj.mObject; 
        if (mObject != NULL)
            mObject->addRefenceCount();
        return *this;
    }
    /* 
     代理模式 有smartptr a b c 4个类只
     有smartptr能调用fun1这个函数,那么其他的三个类怎么调用fun1呢
     很简单,先调用smartptr的fun1 把a or b or c的fun1的结果返回去,或者传给它们都行 
    */
    void fun1(){
        mObject->fun1();
    }
private:
    CMyString* mObject;
};
 
 
void fun1(){
    CSmartPtr pa1(new CMyString("helloworld"));
    CSmartPtr pa2(pa1);
    CSmartPtr pa3(new CMyString("china"));
    CSmartPtr pa4;
    pa4=pa1;
    return;
}
 
int main(){
    fun1();
    //pa->fun1();
    //pa->fun1();
    return 0;
}
 
总结:
智能指针原理是利用栈对象的自动释放,加->运算符的重载

垃圾回收器设计

标签:

原文地址:http://www.cnblogs.com/jk0011/p/5561876.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!