而已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