本文主要讨论2个问题:
1. C++中的gc(垃圾回收)问题.
2. 如何提高内存的使用效率,改善程序的性能
一. C++中的gc
在java,c#中在创建对象的时候,你只需要调用new,而根本不需要去delete.因为这项工作交给由语言内嵌的机制实现了.当一个对象不用的时候,会由这种机制来实现垃圾收集,把资源归还给os的任务.而c++就没这么幸运了.你必须自己负责显示的条用new,delete来显示负责资源的分配和资源的回收.稍有不慎就会出现memory leak.memory leak的严重性我就不说了.我想在这里实现的东西是想讲讲几种gc实现的思路.或者谈不上是垃圾回收吧.只是想做到象java,c#里面一样,只用显示调用new,而不用delete,在对象生命终结的时候会自动释放内存.我想用比较简单的代码来模拟这种思路.
最经典的就是智能指针吧.或者我下面的思路有点象智能指针.呵呵.不过是个简
化的了.
#include<iostream>
using namespace std;
class smpPointer
{
public:
smpPointer(void * p) { _p = p;
}
~smpPointer() { delete _p;
}
private:
void* _p;
};
class A
{
public:
A(){ cout<<"Ctor();";
}
};
void main()
{
A* pointer = new A;
smpPointer ptr(pointer);
}
上面这种实现看起来总是有点不自然,调用new之后必须在栈上分配一个smppointer对象.当程序退出的时候(或者函数运行完毕时候),栈上的对象会销毁,这样就可以自动调用smppointer的析够函数,从而释放内存了.
我们再看下面的版本.基本思路是这样的:用一个链表把每次对象分配的时候分配在何处的位置记下来,放在一个链表中.最后统一回收.实现这种思路的时候,必须为每1个需要改特性的类重载new,delete操作符.也不是很好.
版本2
#include<iostream>
#include <list>
using namespace std;
list<void*> memlist;//分配内存块的指针所链接成的双向链表
class A
{
public:
A() { cout<<"ctor A\n";
}
~A(){ cout<<"detor A\n";
}
void* operator new(size_t size)
{
void* p = malloc(size);
memlist.push_front(p);
return p;
}
void operator delete(void *p)
{
free(p);
}
};
void Destroy()
{
memlist.clear();
}
void fun()
{
A* pa = new A;
A* pb = new A;
A* pc = new A;
cout<<"memlist has: " << memlist.size() <<endl;
Destroy();
}
void main()
{
fun();
cout<<"now memlist has "<< memlist.size();
}