2017-12-22 4 views
2

最近ソートアルゴリズムについて多くのことを読んでいます。 この関数では、forループ内に一時配列を作成する必要があります。コンパイラが自動的にそれを破壊し、各反復の後にメモリを解放するためになぜちょうど、new演算子なしで直接作成しない: とサンプルコードは、問題があるC++何が一時オブジェクトと配列を扱う適切な方法ですか?

for(;;)//ignore the condition 
{ 
    int *b = new int[N]; 
    //some code 
    delete b[]; 
} 

です。以下のようなループ

int b[N]; 

でこれを書いて、前に、私はいつも一時的なタイプ/オブジェクトを作成するには、このメソッドを使用します。私はまったく間違っているか、配列のようなものが組み込み型とは違うのですか?

だから、種類のスタックオーバーフロー、誰も私にいくつかのアドバイスを与えることができますか?

+0

Nが定数ではないと仮定して、あなたはできません。しかし、あなたは間違いなくポインタと新しいの代わりにstd :: vectorを使うべきです。 –

+1

ほんの少しです:GCCはコンパイル時にNがわからない場合、VLA(可変長配列)をサポートしているので、これをうまく受け入れますが、多くのコンパイラは(MSVCのように)しません。移植性が心配されていない限り、これには他の提案と同様にベクトルを使用する必要があります。あなたは技術的には 'alloca()'を使ってVLAのようなサポートを得ることができますが、実際には**これを行うべきではありません。 –

+3

@AlexanderHuszagh * GCCは、Nがコンパイル時に知られていない場合、これをうれしく受け入れます。* IMO、プログラマがコマンドラインで要求しない限り、喜んでそれを受け入れるべきではありません。なぜgccや他のコンパイラがVLAをデフォルトにするのか分かりません。新しいプログラマーは、有効なC++コードを書いていると信じています。 – PaulMcKenzie

答えて

5

コンパイラ が自動的にそれを破壊し、各 反復後メモリを解放するためになぜちょうど、new演算子なしで直接作成しません。

本当に、なぜですか?

Nがコンパイル時にわかっている場合は、int b[N]を使用してください。

for(;;)//ignore the condition 
{ 
    std::vector<int> b(N); 
    //some code 
} 

あなたは彼または彼女がnew[]delete[]を使用する理由コードの作者に尋ねる必要がありますが、チャンスは、それは単に欠けています:Nはコンパイル時に知られていない場合は

、そしてstd::vector<int>を代わりに使用してください経験の

+0

コンパイル時に、コンパイル時に 'N 'がわからなくても' int b [N] 'を許可するコンパイラがあることに注意してください。しかし、これは標準ではない拡張であり、標準ではありません。 – balki

+1

実際には、適切なコンパイラフラグが使用されている場合、コンパイラはそれを許可しません。それはそれらのコンパイラに関する私の苦情の一つです。**デフォルトでは許可してはいけません**。 – PaulMcKenzie

+0

答えをありがとう。私の問題を解決しました。コードはvisualgo.netからのもので、STLはsort algotirhmの学習の過程ではお勧めできないと思います。 –

3

Nの場合は

int b[N]; 

が細かい使用して、コンパイル手段で知られています。 C++ 11コンパイラを使用できる場合は、std::arrayを使用することもできます。

std::array<int, N> b; 

Nはコンパイル時に知られていない場合は、

int b[N]; 

の使用は非標準です。いくつかのコンパイラだけが拡張機能としてサポートされています。

コンパイル時にサイズがわからない場合は、アプリケーションコードで動的に割り当てられたメモリを管理する代わりにstd::vectorを使用してください。 std::vectorを使用しない理由はありません。

for(;;)//ignore the condition 
{ 
    std::vector<int> b(N); 
    //some code 

    // No need for this at all. 
    // delete b[]; 
} 
1

コンパイラ が自動的にそれを破壊し、各 反復後メモリを解放するためになぜちょうど、new演算子なしで直接作成しません。

あなたのスタックのサイズと一時的な配列のサイズによっては、あなたが(スタックメモリを使い果たす)あなたのスタックを爆破しないように動的メモリを使用してアレイを作成することもできます。

もちろん、すでに言及したように、ベクターは配列よりも優れた選択肢です。

+0

'N'が大きければスタックの大きさについての良い点は、私はそれを私の答えで言及することを完全に忘れました。私の+1。 –

関連する問題