web-dev-qa-db-ja.com

スタックではなくヒープ上にあるC ++で配列を作成するにはどうすればよいですか?

私は非常に大きな配列を持っており、長さは262144要素でなければなりません(将来的にはもっと大きくなる可能性があります)。私は次のようにスタックに配列を割り当てようとしました:

#define SIZE 262144
int myArray[SIZE];

ただし、特定のポイントを超えて要素を追加しようとすると、それらにアクセスしようとすると値が異なるように見えます。これは、より多くのメモリを持つヒープとは対照的に、スタックには有限量のメモリしかないためだと理解しています。

私はあまり運がなくて次のことを試しました(コンパイルされません):

#define SIZE 262144
int *myArray[SIZE] = new int[SIZE];

そして、mallocの使用を検討しましたが、これを行うためのC++のような方法がもっとあるのではないかと思っていました...

#define SIZE 262144
int *myArray = (int*)malloc(sizeof(int) * SIZE);

mallocを使用する必要がありますか?

13
Nick Bolton

あなたはそのような新しいものを使いたいでしょう:

int *myArray = new int[SIZE];

念のため、これの反対側についても説明します。

スタックからヒープに移行するため、作業が終了したら、このメモリもクリーンアップする必要があります。スタックでは、メモリは自動的にクリーンアップされますが、ヒープでは、メモリを削除する必要があります。その配列なので、次を使用する必要があります。

delete [] myArray;
47
Reed Copsey

それを行うためのよりC++の方法は、ベクターを使用することです。そうすれば、完了時にメモリを削除することを心配する必要はありません。ベクトルはあなたのためにそれを行います。

#include <vector>

std::vector<int> v(262144);
23
Brian Neal

newはヒープに割り当てます。

#define SIZE 262144
int * myArray = new int[SIZE];
2
Mitch Wheat

コンパイル時に数値が必ずしもわからないため、型はポインタです。

int *myArray = new int[262144];

私は信じている

#define SIZE 262144
int *myArray[SIZE] = new int[262144];

する必要があります

#define SIZE 262144
int *myArray = new int[262144];

またはそれ以上

#define SIZE 262144
int *myArray = new int[SIZE];
1
John MacIntyre

最初の試行が機能しなかった理由は、構文が正しくないためです。これを試して:

int *myArray = new int[SIZE];
0
Tommy Hui

newを使用するための構文が間違っていたため、次のようになります。

int *myArray = new int[262144];

割り当ての右側にサイズを配置するだけで済みます。

ただし、C++を使用している場合は、 std::vector (あなたが持っているでしょう)または boost::scoped_array メモリ管理を少し簡単にします。

0
Wilka