0

最初のケース:

void func(int size)
{
  int arr[size];

  for(int i=0;i<size;i++)
   arr[i]=1;

  for(int i=0;i<size;i++)
   cout<<arr[i];

}

int main()
{
  func(6);

  return 0;
}

or,

2番目のケース

void func(int size)
{
  int *ptr = new int[size];

  for(int i=0;i<size;i++)
    ptr[i]=1;

  delete[] ptr;
}

クエリ:

2つの違いは何ですか(ここでは最初のケースの動的割り当てですか)?

どちらを使用するのが最適ですか (要素が 6 であるため、最初に選択するのが最適です)?

最初のケースは動的スタック割り当てと呼ばれますか?

4

2 に答える 2

5

最初のものは C++ ではありません — 可変長配列は現在の標準 (C++11) では許可されていません — C++14 かもしれませんが、まだリリースされていません。コンパイラが問題なくコンパイルできる場合、それは単なるコンパイラ拡張です。GCC を使用している場合は、 でコンパイルすると-pedantic-errors、エラーが表示されます。

2 つ目は悪い解決策です。一般に RAII クラスと呼ばれるリソース管理クラスでリソースをラップする必要があります。そのままにしておくのは危険です。このサイトで RAII を検索すると、多くのトピックが表示されます。

優れた解決策があります: を使用しますstd::vector<int>

于 2013-11-04T05:56:47.210 に答える
1

どちらもまったく同じことをします。唯一の違いは、VLA (可変長配列) では、コンパイラが割り当て、割り当て解除などを処理することです。したがって、VLA はプログラムのストレージ管理を簡素化します。これは、new と delete を手動で使用する必要がある一部の使用を VLA に置き換えることができるためです。 .
どちらもメモリ割り当てにヒープ セグメントを使用することに注意してください。
これを読んでください:http://www.drdobbs.com/the-new-cwhy-variable-length-arrays/184401444
まあ、機能が豊富で、そのようなことに悩まされないSTLベクトルクラスを使用することをお勧めします問題があり、仲良くするのはとても簡単です。
ここにあります:http://www.cplusplus.com/reference/vector/vector/

于 2013-11-04T06:34:35.127 に答える