2013-05-01 17 views
5

私は検索してきましたが、これに対する答えを見つけることができませんでした。 new演算子にと言う方法はありますか?をクラスコンストラクタと呼んでいないのですか?クラスインスタンスのC++初期化されていない配列

MyObject* array = new MyObject[1000]; 

これは、MyObject()を1000回呼び出します。割り当てられたメモリを自分で埋めたいので、コンストラクタで初期化された情報は必要ありません。 malloc()を使用すると、非常に調和のとれたC++コードimhoではありません。

MyObject* array = (MyObject*) malloc(sizeof(MyObject) * 1000); 

答えて

4

mallocに相当するC++は、割り当て関数operator newです。あなたはそのようにそれを使用することができます:

MyObject* array = static_cast<MyObject*>(::operator new(sizeof(MyObject) * 1000)); 

あなたは、新しい配置に特定のオブジェクトを構築することができます。

new (array + 0) MyObject(); 

をどのあなたが初期化したいオフセットと0を交換してください。

しかし、あなたは本当にこの動的割り当てを自分でやってみたいですか?おそらくstd::map<int, MyObject>またはstd::unordered_map<int, MyObject>があなたに適しているので、任意のインデックスにMyObjectを作成できます。

std::unordered_map<int, MyObject> m; 
m[100]; // Default construct MyObject with key 100 
+0

あなたの答えをありがとう。 'static_cast'を上回るCスタイルのキャストを使用する場合の短所はありますか?構築構文は私にとって初めてのものでした。スピードが鍵ですが、実際には固定数の要素の線形配列が必要なのでマップは合っていないと思います。 –

+0

@Niklasこの場合、欠点はありません。 Cスタイルのキャストは、成功するキャストセットの最初のものとして定義されています。この場合、 'static_cast'と同等です。しかし、私は明白であることを好む。また、プレースメントの新しい構文については、Stack Overflowに関する多くの情報があります。 –

+0

@NiklasRオブジェクトを順番に(インデックス0以上から)または配列内の任意の位置に作成したいですか?それらを順番にしたい場合は、遅い 'std :: vector'答えが適切です。 –

4

確かに、mallocはC++コードとあまり調和しません。しかし、mallocはあなたが求めているものを正確に行います。だから私はあなたが求めているものがC++とあまり調和していないことを恐れています。私はあなたがちょうどあなたがむしろCまたはC + +でプログラミングする言語を決定する必要があると思う。

あなたの唯一の本当のオプションは、MyObjectをコンストラクタを持たないように書き直すことですが、実際にはC++の方法ではありません。

3

だけのランダムアクセスのためのstd ::ベクトル

std::vector<MyObject> v; 

v.reserve(1000); // allocate raw memory 
v.emplace_back(42); // construct in place 

を使用します(これは内部的に何をするかのstd ::ベクトル)は、基本的に(ある):

typedef std::aligned_storage<sizeof(MyObject), std::alignment_of<MyObject>::value>::type Storage; 
MyObject* myObjects(reinterpret_cast<MyObject*>(new Storage[1000])); 

new (myObjects + 42) MyObject(/* ? */); // placement new 
(*(myObjects + 42)).~MyObject(); 
0

は、あなたがそれをタイムアウトしましたか?それは「あまりにも長い」時間がかかりますか?これは、最初のように、プログラムの実行中に1回だけ発生しますか?最初にそれが実際に問題であると判断します。

本当にこのように1000個のオブジェクトを割り当てる必要はありますか?

コンストラクタが呼び出されない場合、オブジェクトはどのように構築されますか?

+0

これは有用な答えではありません。はい、私はそれが実際に*問題であると判断しました。可能であれば、オーバーヘッドを減らす必要があります。 –

+3

問題ありません。それは他のコメント作成者によって提起されたものではなく、あなたの質問では言及していないので、それは適切な角度だと思った。今私はsftrabbitが "私はあなたが本当に自分自身でこの動的割り当てをやりたいかどうか疑問に思っています。"と尋ねました。これは私の2番目のコメントに似ています。 – codah