2011-01-31 8 views
1

動的にメモリを割り当てるためのnewの使用について混乱しているビット。「new」を使用したC++での動的割り当て

私は100個のint型(intは4バイトであると仮定した場合)のためにメモリを割り当てる必要がある場合、私は言う必要があります。

int *ptr = new int[100]; 

または

int *ptr = new int[100*4]; //assuming int is 4 bytes. 
  1. Basially new演算子は、バイトや多くのバイトというメモリを割り当て新しい演算子を呼び出すときに使用されるタイプTの?

  2. 私のクラスにアロケータメンバ関数が定義されていない場合、&私はそのクラス型のオブジェクトの配列を割り当てる必要があります、新しいoepratorはsizeof(クラス型)を見つけ、作業?

EDIT:

複数の質問にクラビングのため申し訳ありませんが、その関連:

するコードの作業罰金のこの作品、私はサイズが[100]の2次元配列を割り当てたい場合は、[4] int of

int *arr = new int [100][4]; 

ありがとうございます。

-AD

答えて

4

新たに指定されたサイズは、アイテムの数、ないメモリサイズです。ただし、代わりにstd :: vectorを使用することを検討してください。

たとえば、new int[100]は、少なくとも100 * sizeof(int)バイト(sizeof(int)が4の場合は400)を割り当てます。これ以上割り当てを行うと実装と実行時の詳細があるため(は非常にを除く)、依存することはできません。

オペレータnewまたは演算子new []がクラスにない(通常は使用しない)場合、グローバルバージョンが使用され、sizeof(your_type)が正しく使用されます。


try the code in the updateでしたか?

多次元配列は、実際には配列の配列です。ので、新しい戻り配列へのポインタであることは、単一次元配列の場合と同じように最初の項目へのポインタ:

typedef int int4[4]; // for clarity 
int4 *arr = new int4[100]; 
// above two lines are identical to: 
int (*arr)[4] = new int[100][4]; 

は再び、あなたはこの自分を管理するよりも、コンテナを使用して、ほとんど常に方がいいでしょう。それはベクトルです。その他にboost :: arrayや "square" 2次元配列専用の "matrix"型のようなコンテナもあります。

+0

@Fred:返信いただきありがとうございます。私のorignalコードはC + C++(80%/ 20%)のミックスであり、C++にはあまり精通していません。しかし、std :: vectorを使用する簡単なテストコードの例を指摘できますか? – goldenmean

+0

@goldenmean:それよりも、私はいくつかの点を指摘することができます:*加速C++ *、*プログラミング:C++ *や[others](http://stackoverflow.com/q/388242)を使った原則と実践。 –

+0

intのサイズ[100] [4]の2D配列を割り当てたい場合、このコードはうまく動作します:int * arr = new int [100] [4]; – goldenmean

1

mallocはアイテム数ではなくデータサイズを使用するため、混乱が生じることがあります。100個の整数の配列を割り当てるには、あなたが行うことができます:

int *ptr = (int *)malloc(100 * 4); 

または(intは常に4バイト長ではないので、より良いが、すべてのプラットフォームで動作します):

int *ptr = (int *)malloc(100 * sizeof(int)); 

の代わり:

int *ptr = new int[100]; 

フレッドが述べているように、データサイズを自動的に使用して正しい領域を割り当てます。もちろんmallocは、intのようなビルトインタイプにのみ使用できます。

+0

Mallocはどのような型でも使用できますが、オブジェクトを構築(そしてその後で破棄して解放)する必要があります。 Mallocは、新しい演算子ではなくoperator new(その名前の関数)と比較されるべきです。 –

+0

あなたは正しいです - 実際には、組み込みのものかどうかにかかわらず、どんなタイプのためにもスペースを割り当てることができます(ただし、割り当てられたスペースは、組み込みタイプの場合はすぐに使用できるのに対し、コンストラクタを適切に初期化する必要があります) 。 – Emmanuel

関連する問題