2016-06-30 7 views
0

配列を作成したいとし、データを構築して関数の配列に追加したいとします。配列は関数の外で使用されるため、作成を関数にまとめるだけです。関数の外部で配列のメモリを割り当てて、その位置へのポインタを関数に渡すのが最善でしょうか?または、関数内の配列のメモリをnewを使って割り当て、メモリ内の位置へのポインタを返す方が良いでしょうか?それとも私がやるべきことがもうありますか?C++で配列のメモリを割り当てるタイミングは?

私はこの機能をどのように呼び出すのかによって、スタックにメモリを割り当てるかヒープに割り当てるかを選択できるという利点があると思います。この配列がヒープ上にある必要はないかもしれませんが、私はそれを呼び出す関数のために必要です。関数のメモリの作成と削除について心配する必要はありません。なぜなら、外部コードがそれを処理するからです。 2番目のメリットは、もっとシンプルだと思います。

+9

'のstd :: vector' ... – deviantfan

+8

はちょうど'のstd :: vector'を使用します(必要に応じて 'const')参照することによってそれを周りに渡すと、あなたはメモリの割り当てを心配する必要はありません。 – ArchbishopOfBanterbury

+0

さらに、 'std :: vector <>' :)を使ってください。 – lorro

答えて

9

std::vectorを使用してください。この種のものはまさにそのためのものです。

0

すべては、あなたが何をしたいかによって異なります。スタックは、もちろん割り当てがはるかに高速ですが、この問題はコンテキストに依存します。

この配列に何が起こるかをカプセル化したい場合、3番目のオプションは、オブジェクトにオブジェクトを囲み、コンストラクタで初期化を実行することです。この方法では、初期化で割り当てを隠すのではなく、割り当ての初期化を隠すことになります。このタイプの配列を作成するたびに、必ずそのように初期化されます。

ダイナミックメモリを搭載した例:もちろん

class MyArray { 
    std::unique_ptr<int[]> array; 
    public: 
    MyArray(int n) : array(new int[n]) { 
     /* initialization here */ 
    } 
    int& operator [](int i) { return array[i]; } 
} 

、あなたは独自のクラスではなくポインタとしてそれを周りに渡す(ただし、とにかく周りべきないパスポインタ)しなければならない、とあなたが持っていますoperator []のように、オブジェクトの外側から配列にアクセスするメソッドを実装します。

あなたはそれをカプセル化する場合であっても、スマートポインタを使用してください:vectorはまだいくつかのオーバーヘッドを持っていながら、unique_ptrだけの光と通常のポインタとして速いようですが、動的メモリとすぐが外になるように解放されることを保証します可能な限りすべてのパスにdeleteを置く必要はありません。あなたは、彼らはあなたが配列の場合はもちろん

template<int len> 
class MyArray { 
    int array[len]; 
    public: 
    MyArray(int n) { 
     /* initialization here */ 
    } 
    int& operator [](int i) { return array[i]; } 
} 
-2

のスタック上に置くことができますする必要がどのくらいのコンパイル時にわかっている場合

は、またはあなたは常にいくつかのメモリを割り当てる必要があります。

int a[20]; 
     or 
    int *a = (int*)malloc(20*sizeof(int)); 

メモリを配列に割り当てることなく、コンパイラはエラーメッセージを生成します。

+0

C++で' malloc'を使わないでください! – Kevin

+0

C++では "new"キーワードを使用していますが、私はそれを認識しています。 mallocはC言語で使われています! –

関連する問題