本人自己开发软件多年,内存管理都是使用new分配,随时用随时删。现在的项目中有成千上万的小对象,如果全部采用这种方式的话,会造成内存碎片增多,机器变慢甚至无内存可用。虽然现在内存都是白菜价,但是如何更好的管理好内存可是我们程序员的事情,尤其是C++程序员必须要做好。我记得有句话是这么说的,客户的计算机是为客户服务的,不是为程序员服务的。
于是我自己写了内存池,对内存进行管理。但是一般情况下使用非对象的内存分配用的挺好,用完后还给内存池。但是对于类对象的内存分配不能很好的管理,于是想使用Placement new 的方法,先使用new分配一块内存,然后让类在指定的地址进行构造。
#include <new.h>
class TTest{
int x,y;
};
void main(){
void *p = getmem(sizeof(TTest));
//此处的getmem在内存池中分配指定的大小相近的内存,稍大一些。但是是32的整倍数。getmem是自定义的内存池管理函数。
TTest * test = new(p) TTest; //此处new并没有分配新的内存,只是将指针p返回。
//test的实例就在p指定的地方开始初始化。
test->free();
//此处不能调用delete删除test,而是调用其析构函数,其占用的内存由内存池管理。
delmem(p);
//此处将内存还给内存池,重复使用。delmem是自定义的内存池管理函数。
}
//经过测试,testt和p指向的都是一个地址。
/*但是后来我使用了VCL中的类进行这样的分配,结果其地址始终不一样。原因是VCL的类其代码都在对应的bpl库中,已经被编译成目标文件,编译期间并不能调用重载的那个全局new函数。但是我继承出来的新的类应该重新被编译,不知为何还是不行。一旦继承自VCL的对象,p和b的地址就不一样。请高手指点!*/