2009-07-03 11 views
2

それはコンパイルし、絶対に細かい動作しますから... をこのコードをチェックしてください質問は、私はC++(ターボC++)を学び始めたとき、私は..C++で実行時に可変長の配列を宣言できますか?

datatype var[variable_set_at_runtime]; 

として任意の型の配列を宣言することができたことがないということですそして、私はこれが最新のgccコンパイラでは不可能であることは当たり前だと思っていましたが、驚くべきことにこれが可能です...

私の関連する質問は何ですか?私が感じる

何の違い

私は等... new演算子を動的にそのリソースへのアドレスを返し、ヒープ内の実行時にメモリを割り当てるなど、多くのことを行うことを知っているが...私のコードが動的に割り振ることですスタック上のメモリは新しいがヒープ上でそれを行うのですか?これは唯一の違いです...

私は本当にこのようなことを書いた後、私はこれを行うことができませんでしたので、私はC++を学び始めました...そしてそれを追加するために私はカスタムデータ型に対してもこれを行うことができます。 ..:-O

#include<iostream> 
using namespace std; 
struct A 
{ 
    int a; 
    int b; 
}; 
int main() 
{ 
    int a; 
    cin>>a; 
    int ch[a]; 
    for(int i=0;i<a;i++) 
     ch[i]=i+1; 
    for(int i=0;i<a;i++) 
     cout<<"\n\nch=="<<ch[i]; 
    A obj[a]; 
    cin>>obj[a-1].a; 
    cin>>obj[a-1].b; 
    cout<<"\n\n obj.a,obj.b=="<<obj[a-1].a<<" , "<<obj[a-1].b; 
} 

..

おかげでいくつかの光を当てるしてください。

+0

7分以内に応答があります。素晴らしい::-0 – ashishsony

+0

興味深い:MSVCはこれをまだサポートしていません。だから、あなたのコードはMSの世界にコンパイルされません:-) – mmmmmmmm

答えて

11

とそれはC Cで有効ですが、ない...

を私はこの は最新のgcc のコンパイラで可能で傾けることを許可されたためにそれを取った...しかし、意外にもこれが可能 です++ 。コンパイラのフラグによってGCCが許可されるかもしれませんが、あなたのコードを厳密なC++(あなたがすべきです)としてコンパイルすると、動的長さの配列は許可されず、newを使用する必要があります。それがスコープの外に出たとき、スタック上の

  • データは自動的にクリーンアップされます。これとは別に

    を(私は誰もまだこの小さなディテールを言及していない驚いている)、他の二つの大きな違いがあることです

  • 通常、1MBのようなものだけがスタックに割り当てられます。大規模なデータ構造は、代わりにヒープ上に移動する必要があります。

実際、最も重要なのは最初の1つです。有効なC++ではありません。 (そして、Neilが指摘したように、C++ 0xでも有効ではありません。これをC++に追加する計画はありません)

+2

誰かが尋ねる前に、C++ 0xでも有効ではないようです。 –

+2

さらに、C99でのみ有効です。 –

+0

btw C++ 0xはどのように発音されますか? – ashishsony

0

スタックは非常に少量のメモリです。小さい、一時的なものだけをスタックに割り当てる必要があります。大きなオブジェクトまたは非一時的なオブジェクトは、ヒープ上に割り当てられるとうまくいくでしょう。

はい、注意深いメモリ管理が必要です。

0

割り当てが「範囲外」になると、「自動的に」割り当てられたものが表示されなくなります。 newで "ヒープ上に割り当てられたもの"は割り当てられません。

0

指定した変数は、スタックに配置されます。範囲外になると、それはもはや有効になりません。ただし、配列を宣言するためにnewを使用すると、ヒープに割り当てられ、削除を呼び出すまで有効です。

datatype *var=new [variable_set_at_runtime]; 

をして、あなたがそれを終了したら、それを削除します:

1

新しい使用したい

delete[] var; 
0

あなたはまだヒープ上に物事を割り当てることnewオペレータを必要とし、この

スタックは、サイズに関してヒープよりもはるかに制限されていることが多く、私は気に入っていますOいいえ、私はnewが長くしばらく少しのために周りのかもしれないと思う

:-)可変長配列の宣言方法を使用して作成されたオブジェクトのリンクリスト(または任意の非配列コレクション)を参照してください。

2

あなたは新しいを使用して、ヒープ上に割り当てることがあります。

int* ch = new int[ a ]; 

をしかし、使用後にそれを解放することを忘れないでください:

delete [] ch; 

より良い方法を用いることであろうstd::vectorはあなたが望むものを正確に行います。 「私は何を感じるの違い??新しいヒープ上でそれをしないながら、自分のコードが動的にスタック上にメモリを割り当てることで、これが唯一の違いです...」

+0

私はC++を初めて使っています。私はあなたの提案を試みました。私はちょうど私のコードが正しいかどうかを知りたい。私はこの 'delete [] ch;'を 'main()'関数の一番下に置いたのですか?つまり、コード全体の終わりです。私はちょうど初心者としてそれを学びたいです、私は 'std :: vector'を将来使用します)。 –

0

正確違いのthats。覚えてね。スタックにはスペースが限られていますが、ヒープには制限がありません(明らかにいくつかの制限があります。一般的には、あなたのスタック割り当てが比較的小さいことを知っているなら、あなたのメソッドを使用してください。さもなければヒープ上に作成してください。

1

2つの異なるアプローチがあります。それはいくつかの問題を抱えています。たとえば、メモリを漏らさないようにする必要があります。

私はむしろ、この種のものを処理するためにSTLを使用することを提案したいと思います。

あなたは自分でメモリ管理を処理する必要はありませんし、コードはきれいに見えます。

は、いくつかのガイドのためにここを見て:http://www.sgi.com/tech/stl/

+1

+1:STLは、C++で動的配列を実装する最も適切なソリューションです。 std :: vector <>のようなものは配列の素敵な置き換えです。 –

+0

@ D.Shawleyあなたは、この種の関数(C++での動的配列の実装)が、ベクトルとベクトルの間にどのように優れていると思いますか?私は偶然にも非常に簡単なことが分かり、とても簡単で便利です。 –

0

使用_allocaを。 Variable Sized Arrays in C

+0

'malloc' /' free'シリーズの割り当ては、 'new' /' delete'のようにコンストラクタやデストラクタを呼び出さないので、Cライブラリとのインタラクションが必要な場合を除き、使用しないでください。 – dmckee

+0

OPには、 'int'配列とコンストラクタを持たないPOD構造体配列があります。代わりに第1クラスの 'class'を使用するが、スタック割り当て(例えば、コードが性能に敏感である場合)を依然として望むなら、彼はインプレース' new'を呼び出して手動でデストラクタを呼び出すことができます。 –

関連する問題