placement newメカニズムの初期プローブ

3553 ワード

1.まず最初の例を見てみましょう.
[cpp] view plain copy
#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.2つ目の例を見る
[cpp] view plain copy
#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;  

}  

2回のメモリ割り当てはbufferのヘッダアドレスから始まることが分かったので、bufferの中には1つのオブジェクトのメモリしか割り当てられていないと推測します.
3.第3例
[cpp] view plain copy
#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)バイトのメモリが必要で割り当てられた空間などの情報を格納することを説明した.