首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

有沒有好的C語言內存管理或垃圾收集的方案?该怎么解决

2012-02-27 
有沒有好的C語言內存管理或垃圾收集的方案?我想搞個C語言写的内存管理器,最好能有垃圾收集的思想在里面。动

有沒有好的C語言內存管理或垃圾收集的方案?
我想搞個C語言写的内存管理器,最好能有垃圾收集的思想在里面。

动态分配内存不需要调用者去管理释放指针。

有没有好的可以借鉴的方案或开源的内存管理器?

[解决办法]
有吧,貌似都是插件之类的,百度一下看看

纯粹自己写很麻烦,连C++都只在某些特定类库中做到内存安全,而无法做到全局
[解决办法]
自己写的一个很简陋的内存分配管理程序,大家别笑话啊!

C/C++ code
#include"malloc.h"#include<iostream>using std::cout;using std::endl;class Point{    class Pool    {    public:        int *flag;        Point* mem;        const int len;        Pool(int n):len(n)        {            flag=(int*)malloc(sizeof(int)*n);            mem=(Point*)malloc(sizeof(Point)*n);            for(int i=0;i<n;++i)                flag[i]=n-i;        }        ~Pool()        {            free(flag);            free(mem);        }        void set(int index,int sublen)        {            for(int i=index-1;i>=0;--i)                if(flag[i]>0)                    flag[i]-=sublen;                else                     break;            for(i=index;i<index+sublen;++i)                flag[i]=-sublen;        }        void reset(int index,int sublen)        {            int tmp;            if(index+sublen==len||flag[index+sublen]<0)                tmp=0;            else                tmp=flag[index+sublen];            for(int i=index+sublen-1;i>=index;--i)                flag[i]=++tmp;            for(i=index-1;i>=0;--i)                if(flag[i]>0)                    flag[i]+=tmp;                else                    break;        }    };    static Pool myPool;public:        double x,y;    Point()    {        cout<<"1个Point对象被创建"<<endl;    }    void print()    {        cout<<"["<<x<<","<<y<<"]";    }    void* operator new(size_t n)    {        for(int i=0;i<myPool.len;++i)            if(myPool.flag[i]>0)                break;        if(i==myPool.len)             return 0;        myPool.set(i,1);        cout<<"从"<<myPool.mem+i<<"分配1个Point"<<endl;        return myPool.mem+i;    }    void* operator new[ ](size_t n)    {        for(int i=0;i<myPool.len;++i)            if(myPool.flag[i]>=(int)(n/sizeof(Point)))                break;        if(i==myPool.len)             return 0;        myPool.set(i,n/sizeof(Point));        cout<<"从"<<myPool.mem+i<<"分配"<<n/sizeof(Point)                <<"个Point"<<endl;        return myPool.mem+i;    }    void operator delete (void* p)    {            cout<<"从"<<p<<"释放1个Point"<<endl;        int tmp=(Point*)p-myPool.mem;        myPool.reset(tmp,1);    }    void operator delete [ ](void* p)    {           int tmp=(Point*)p-myPool.mem;        cout<<"从"<<p<<"释放"<<-myPool.flag[tmp]<<"个Point"<<endl;        myPool.reset(tmp,-myPool.flag[tmp]);    }    static void print_pool()    {        for(int i=0;i<myPool.len;++i)            cout<<myPool.flag[i]<<" ";        cout<<endl<<"------------------"<<endl;    }};Point::Pool Point::myPool(10);int main(){    Point *pp1=new Point;    cout<<"pp1="<<pp1<<endl;    Point::print_pool();            Point *pp2=new Point[4];    cout<<"pp2="<<pp2<<endl;    Point::print_pool();        Point *pp3=new Point[5];    cout<<"pp3="<<pp3<<endl;    Point::print_pool();        delete []pp2;    Point::print_pool();        delete pp1;    Point::print_pool();    delete []pp3;    Point::print_pool();    return 0;}
------解决方案--------------------


完全自动不太可能
C++倒是可以合理的使用智能指针就可以了.
很方便的.
[解决办法]
http://blog.codingnow.com/2008/06/gc_for_c.html
[解决办法]
好像是很高深的东西,先收藏一下吧

世界最短恐怖小说:惊醒,身边躺着自己的尸体。 
世界最短黑帮小说:穿上马甲,别让人认出来。 
世界最短童话:癞蛤蟆娶到天鹅喽! 
世界最短寓言:蚂蚁累死了,蚁后还那么胖。
http://www.doozii.com/?welcom1

热点排行