pcl = new (buffer) JustTesting;
// free Heap1
// free Heap2
// free buffer
heap: 00320CE0
// place object in buffer
pc2 = new JustTesting("Heap1", 20); // place object on heap
cout << "Memory block addresses:\n" << "buffer: "
<< (void *) buffer << " heap: " << pc2 << endl;
cout << "Memory contents:\n";
cout << pcl << "; ";
pc1->Show ();
cout << pe2 << ": ";
pc2->Show();
JustTesting *pc3, *pc4;
pc3 = new (buffer) JustTesting("Bad Idea", 6);
pc4 = new JustTesting("Heap2", 10);
cout << "Memory contents:\n";
cout << pc3 << ": ";
pc3->Show();
cout << pc4 << ": ";
pc4->Show ();
delete pc2;
delete pc4;
delete |] buffer;
cout << "Done\n";
return 0;
该程序使用 new 操作符创建了一个512 字节的内存缓冲区,然后使用 new 操作符在堆中创建两个
JustTesting 对象,并试图使用布局new操作符在内存缓冲区中创建两个JustTesting对象。最后,它使用delete
来释放使用new分配的内存。下面是该程序的输出:
Just Testing constructed
Heap1 constructed
Memory block addresses:
buffer: 00320AB0
Memory contents:
00320ABO: Just Testing, 0
00320CEO: Heapl, 20
Bad Idea constructed
Heap2 constructed
Memory contents:
00320ABO: Bad Idea, 6
00320EC8: Heap2, 10
Heapl destroyed
Heap2 destroyed
Done
和往常一样,内存地址的格式和值将随系统而异。
程序清单12.8在使用布局new操作符时存在两个问题。首先,在创建第二个对象时,布局new 操作
符使用一个新对象来覆盖用于第一个对象的内存单元。显然,如果类动态地为其成员分配内存,这将引发
问题。
其次,将delete用于pc2和pc4时,将自动调用为pc2和pc4指向的对象调用析构函数;然而,将delete[]
用于buffer时,不会为使用布局new操作符创建的对象调用析构函数。
这里的经验教训与第9章介绍的相同:程序员必须负责管理布局new操作符从中使用的缓冲区内存单
元。要使用不同的内存单元,程序员需要提供两个位于缓冲区的不同地址,并确保这两个内存单元不重叠。
例如,可以这样做:
pcl - new (buffer) JustTesting;
pc3 = new (buffer + sizeof (JustTesting) ) JustTesting("Better Idea", 6);