placement new机制初探
1.首先我们看第一个例子:
[cpp] view plaincopy
#include <iostream> using namespace std; typedef char byte; int main() { byte *buffer = new byte[1000]; int *pi = new(buffer)int[10]; pi[0] = 3; cout<<(int)*buffer<<endl; delete []buffer; return 0; }
输出结果是3,说明内存的分配是在buffer里边的,其实也不能称之为内存分配,是在已经分配好的一部分内存空间里边来划分。
2.看第二个例子
[cpp] view plaincopy
#include <iostream> typedef char byte; using namespace std; int main() { byte *buffer = new byte[1000]; int *p1 = new(buffer)int[10]; p1[0] = 3; //输出第一个元素的值 cout<<(int)*buffer<<endl; int *p2 = new(buffer)int[10]; p2[0] = 4; //赋值以后输出第一个元素的值 cout<<(int)*(buffer)<<endl; //再次输出第一个元素的值 cout<<p1[0]<<endl; //输出这些地址 cout<<(int)buffer<<endl; cout<<p1<<endl; cout<<p2<<endl; delete []buffer; return 0; }
发现,两次的内存分配都是从buffer的首地址开始的,所以我猜测,buffer里边仅仅允许分配一个(一组)对象的内存。
3.第三个例子
[cpp] view plaincopy
#include <iostream> using namespace std; class Integer { private: int datum; int a,b,c,d; public: Integer(int ival = 0) { a = b = c = d = datum = ival; } Integer(Integer const& rhs) { datum = rhs.datum; } Integer& operator = (Integer const& rhs) { datum = rhs.datum; return *this; } ~Integer() { cout << "~Integer" << endl; } operator int () const { return datum; } }; int _tmain(int argc, _TCHAR* argv[]) { int const ELEMENT_COUNT = 8; unsigned char *buffer = new unsigned char [ELEMENT_COUNT * sizeof(Integer) + sizeof(int)]; Integer *data = new (buffer) Integer[ELEMENT_COUNT]; for (int i = 0; i < ELEMENT_COUNT; i++) { data[i].~Integer(); } delete [] buffer; return 0; }
在申请buffer的时候需要多申请sizeof(int)的内存才不会出错,说明了编译器对用户自定义类型的存储方式---后边需要有sizeof(int)字节的内存来存储分配的空间等信息。