2

このコードをチェックしてください。コンパイルされ、完全に正常に実行されます。問題は、c ++(turbo 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;
}

少し光を当ててください。

ありがとう。

4

10 に答える 10

11

そして私はこれが最新のgccコンパイラでは不可能であることを当然のことと思っていました...しかし驚くべきことにこれは可能です...

Cでは合法ですが、C++では合法ではありません。GCCはコンパイラフラグによってはそれを許可する場合がありますが、コードを厳密なC ++としてコンパイルする場合(そうする必要があります)、動的長配列は許可されないため、を使用する必要がありますnew。(私はまだ誰もこの小さな詳細に言及していないことに驚いています)

これとは別に、他の2つの大きな違いは次のとおりです。

  • スタック上のデータは、スコープ外になると自動的にクリーンアップされます
  • 通常、スタックには1MB程度しか割り当てられません。代わりに、大規模なデータ構造をヒープに配置する必要があります。

しかし、実際には、最も重要なポイントは最初のものです。これは有効なC++ではありません。(そして、ニールが指摘したように、C ++0xでも無効です。これをC++に追加する予定はありません)

于 2009-07-03T13:19:20.313 に答える
2

new:を使用して、ヒープに割り当てる必要があります。

int* ch = new int[ a ];

ただし、使用後に割り当てを解除することを忘れないでください:

delete [] ch;

より良い方法は、あなたが望むことを正確に実行するstd::vectorを使用することです。

于 2009-07-03T13:14:05.270 に答える
1

現在、2つの異なるアプローチがあります。他の回答が示唆しているように、新しい演算子を使用しますが、いくつかの問題があります。たとえば、メモリをリークしないようにする必要があります。

むしろ、この種のもの、たとえばリストを処理するためにSTLを使用することをお勧めします。

そうすれば、メモリ管理を自分で処理する必要がなくなり、コードがきれいに見えます。

ガイドについては、こちらをご覧ください:http ://www.sgi.com/tech/stl/

于 2009-07-03T13:27:28.577 に答える
1

newを使用します:

datatype *var=new [variable_set_at_runtime];

使い終わったら削除します。

delete[] var;
于 2009-07-03T13:13:00.313 に答える
0

_allocaを使用します。Cの可変サイズ配列については、ここで私の答えを参照してください

于 2009-07-03T13:31:03.497 に答える
0

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

はい、それには注意深いメモリ管理が必要になります。

于 2009-07-03T13:12:23.980 に答える
0

「自動的に」割り当てられたものは、割り当てが範囲外になると消えます。「ヒープ上」に割り当てられたものはそうでnewはありません。

于 2009-07-03T13:12:24.853 に答える
0

指定したとおりに宣言された変数はすべてスタックに置かれます。範囲外になると、無効になります。ただし、newを使用して配列を宣言すると、配列はヒープに割り当てられ、deleteを呼び出すまで有効なままになります。

于 2009-07-03T13:12:41.670 に答える
0

ヒープ上に物を割り当てるには、newオペレーターが必要です。これは、作成された関数の範囲を超えて存続させたい場合に必要です。

スタックは、サイズの点でもヒープよりもはるかに制限されていることが多く、可変長配列宣言メソッドを使用して作成されたオブジェクトのリンクリスト(または非配列コレクション)を確認したいと思います:-)

newいいえ、もう少し長くなると思います。

于 2009-07-03T13:13:31.997 に答える
0

「私のコードが動的にメモリをスタックに割り当て、新しいものがヒープに割り当てるという違いは何だと思いますか??これが唯一の違いです...」

それがまさに違いです。覚えとけ。スタックのスペースは限られていますが、ヒープには制限がありません(明らかに、いくつかの制限があります... 1つに4ギガの割り当てを行ってみてください;))。一般に、idは、スタック割り当てが比較的小さいことがわかっている場合はメソッドを使用し、そうでない場合はヒープ上に作成することを示しています。

于 2009-07-03T13:14:48.293 に答える