在已分配的内存中构造一个对象

         new的头文件可定义多达六种使用new的重载方式。其中两种方式-- placement new和placement new[] 可以使你在已分配的存储缓冲器中定义一个对象或者一组数组对象。



用placement new代替普通的new定义对象,在一些有时间限制的应用程序中起到了不小的作用,在那些程序中对象的定义要在一定的时间内完成。普通new定义的对象的生存时间是未定的,因而可能会造成操作失效。

为了避免操作失效,我们可以分配一个足够大且未使用的存储缓冲器,然后将程序中所有的对象分配到缓冲器中。为了使讨论简单化,我们集中讨论placement new。

        首先,用普通的new分配存储缓冲器,但不要使用动态或者静态存储装置,因为它可能无法满足对构造对象进行校正的需求。

void *buff=new char[sizeof(Myclass)];

接着,用placement new在已经分配好的的缓冲器上创建一个对象。

    #include <new> //needed for placement new

Myclass *p = new(buff) Myclass;


需要指出的是,p指向的是一个Myclass类型的对象。该对象已经分配到缓冲器中。

与分配给自由存储的普通对象不同的是,放置对象的析构函数必须明确的被调用。

p->~Myclass();  //explicit destructor invocation

失败地调用析构函数会引起未知的问题的发生。通常,只有在明确的调用析构函数以后,才能释放缓冲器中的内容。

      delete[] buff;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值