关于 Placement new 的用法,求解!

  本人自己开发软件多年,内存管理都是使用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的地址就不一样。请高手指点!*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值