デフォルトのコンストラクション関数がなく、オブジェクト配列を定義する方法

1453 ワード

クラスがデフォルトのコンストラクション関数を定義していない場合、クラスを構築するオブジェクト配列が問題になります.そこでnewオペレータを割って用いるコードを実現した.まずメモリを割り当ててから、割り当てられたメモリにコンストラクション関数構築オブジェクトを呼び出し、次のコードを簡単にメモします.
//                     ,      

//operator new + ctor
//dtor + operator delete 

//operator new[] + ctor
//dtor + operator delete []

#include 
using namespace std;

class A
{
private:
    int x;
public:
    A(int _x):x(_x){}
    ~A() {}
};
//                  ,     !!

int main()
{
    //A vecs[10];   //compile failed
    //Method 1: placement new
    void *raw = operator  new[] (3*sizeof(A));
    A *pa = static_cast;
for(int i = 0 ; i< 3;++i)
new (&pa[i])A(i);     //placement new
//destructor + deallocate
for(int i = 0;  i< 3;++i)
pa[i].~A(); //   で    が び されただけで、メモリは  されません。
operator delete[](pa); //メモリの  
//delete [] pa;   //クラスAにコンストラクション  が  されていない  、この は しいが、コンストラクション  が  されるとメモリエラーになり、operator deleteでoperator newが り てたスペースを  するしかない。
//しかし、 の  はコンストラクション  を  するかどうかとは  ありません!!
void *raw2 = operator new(sizeof(int));
int *p = static_cast(raw2);
new (p)int(3);
cout << *p << endl;
delete p;     // み みタイプには    がなく、  deleteでよい
void *raw3 = operator new [] (sizeof(int)*3);
int *pInts = static_cast(raw3);
for(int i = 0 ; i < 3;++i)
new (&(pInts[i]))int(i);  //placement new
for(int i = 0 ; i < 3;++i)
cout << pInts[i] << endl;
operator delete []( pInts);
return 0;
}