您的位置:首页 > 运维架构

类的operator new与operator delete的重载

2012-08-11 10:40 363 查看
为什么有必要写自己的operator new和operator delete?

答案通常是:为了效率。
缺省版本的operator new是一种通用型的内存分配器,它必须可以分配任意大小的内存块。同样,operator delete也要可以释放任意大小的内存块。operator delete想弄清它要释放的内存有多大,就必须知道当初operator new分配的内存有多大。有一种常用的方法可以让operator new来告诉operator delete当初分配的内存大小是多少,就是在它所返回的内存里预先附带一些额外信息,用来指明被分配的内存块的大小。
缺省的operator new和operator delete具有非常好的通用性,它的这种灵活性也使得在某些特定的场合下,可以进一步改善它的性能。尤其在那些需要动态分配大量的但很小的对象的应用程序里,情况更是如此。

内存池:内存池的作用主要也是为了效率。通过一次申请比较大的内存空间,来避免小空间内存的频繁申请和释放,每次需要为对象分配内存空间时,在已经申请的大空间内分配。空闲区被按照对象大小划分为若干块,块与块之间通过链表组织起来。

参考代码:

View Code

// 表示一个飞机对象
class airplanerep: public CachedObj<airplanerep>
{
public:
airplanerep(int id,const string & s,const string & d)
{
ID = id;
start = s;
dest = d;
}

~airplanerep()
{
cout<<"airplanerep destructor!"<<endl;
}

int getID() const
{
return ID;
}

private:
int ID;
string start;
string dest;
};

int main()
{
airplanerep *pa = new airplanerep(101,"shanghai","beijing");
cout<<pa->getID()<<endl;
delete pa;

airplanerep *pb = new airplanerep(102,"shanghai","beijing");
cout<<pb->getID()<<endl;
delete pb;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: