布局NEW操作符

来源:互联网 发布:hp128fn网络打印设置 编辑:程序博客网 时间:2024/05/02 01:39

而已NEW操作符能够在分配内存时指定内存位置。下面的程序使用了布局new操作符和常规new操作符给对象分配内存。

   该程序使用new操作符创建了一个512字节的内存缓冲区,然后使用new操作符在堆中创建两个JustTesting对象,并试图使用布局new操作符在内存缓冲区中创建两个JustTesting对象。

   下面是我的电脑的输出

<略>

 

    上面的程序使用布局new操作时存在两个问题。首先,在创建第二个对象时,布局new操作符使用一个新对象来覆盖用于第一个对象的内存单元。显然,如果类动态地为其成员分配内存,这将引发问题。

     其次,将delete用于pc2和pc4时,将自动调用为pc2和pc4指向的对象调用析构函数;然而,将delete[]用于buffer时,不会为使用布局new操作符创建的对象调用析构函数

   为确定两个单元不重叠,可以这样做:

  

  其中指针pc3相对于pc1的偏移量为JustTesting对象的大小

 

  第二个教训是,如果使用布局new操作符来为对象分配内存,必须确保其析构函数被调用,但如何确保呢?

  例如,在堆中创建的对象,可以这样做:

delete pc2;

然而,对于使用布局new操作符创建的对象,不能像下面一样调用delete

delete pc1; // NO!!!

  原因在于delete可与常规new操作符配合使用,但不能与布局new操作符配合使用。

那么我们要显示调用析构函数,必须指定要销毁的对象:

pc3->~JustTesting();   // destroy object pointed to by pc3