垃圾回收器设计

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了垃圾回收器设计相关的知识,希望对你有一定的参考价值。

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;
}
 
总结:
智能指针原理是利用栈对象的自动释放,加->运算符的重载

以上是关于垃圾回收器设计的主要内容,如果未能解决你的问题,请参考以下文章

C#关于垃圾回收 终结器IDispose的设计规范札记

垃圾回收器设计

golangGC垃圾回收机制设计原理

CMS垃圾回收器

前沿实践:垃圾回收器是如何演进的?

JVM的垃圾回收机制 总结(垃圾收集回收算法垃圾回收器)