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)字节的内存来存储分配的空间等信息。

posted @ 2013-03-11 20:35  JustinYo  阅读(430)  评论(0编辑  收藏  举报