3

そのため、コンパイル時に配列のサイズがわからない場合は、ダイナミックメモリを使用する必要があると常に言われてきました。たとえば、ユーザーは配列のサイズを入力する必要があります。

    int n;

cin >> n;

int array[n];

for(int ii = 0; ii < n; ii++)
{
    array[ii] = ii;
}

for(int ii = 0; ii < n; ii++)
{
    cout << array[ii] << endl;
}

ただし、これは私にとっては問題なく機能します。私は常に、ポインターと新しい演算子を使用する必要があると考えていました。ダイナミックメモリは、アレイのサイズを変更したり、スペースを解放したり、メモリを解放するタイミングを制御したりする場合にのみ使用できますか?ありがとう。

4

4 に答える 4

8

これはコンパイラで許可されている拡張機能であるため、正常に機能します。これは合法的なC++ではないため、避けることをお勧めします。これを回避するために、でコンパイルし-pedanticて、非標準の拡張機能の使用を警告としてフラグを立て、-Werror警告をエラーとして扱うことをお勧めします。または、すべての警告をエラーとして-pedantic-errors扱いたくない場合は、このタイプの警告だけを使用してください。

しかし、それはあなたがポインタとを使うべきだという意味ではありませんnew。代わりにを使用する必要がありますstd::vector。またはおそらくstd::dequeまたはstd::list、しかし非常に特別な目的のためだけに。ほとんどの汎用動的配列でstd::vectorは、が選択されます。

于 2012-10-08T06:02:06.530 に答える
3

まず第一に、使用しているのは標準のC++ではありません。可変長配列は言語拡張であるため、移植性はありません。次に、動的に割り当てられたメモリを明示的に使用することを回避できます。これは、メモリ管理を自分で処理しながら、バックグラウンドで実行するクラスを使用することで実現できます。この場合の明らかな例は次のstd::vectorとおりです。

std::vector<int> v;

for(int ii = 0; ii < n; ii++)
{
    v.push_back(ii);
}
于 2012-10-08T06:02:55.350 に答える
0

C ++では、配列は静的ストレージ用です。サイズはコンパイル時にのみわかります。コンパイル中に一定サイズのスペースが割り当てられます。

通常、コンパイラは配列の動的作成を許可しません。あなたが書いたコードは、配列の動的な作成を可能にするC++の拡張です。代わりに使用することをお勧めしますstd::vector

于 2012-10-08T06:12:06.820 に答える
0

コンパイル時の制限は、アレイだけではありません。

  1. C ++のすべてのタイプには、コンパイル時の制限があります
  2. 新しい操作でそれを回避できる理由は、ヒープに割り当てられたすべての配列要素を含む型がないためです。ヒープの割り当ては型システムの外部にあります。
  3. sizeof(T)は、戻り値が常にコンパイル時定数であるため、機能を文書化します。
  4. std :: vectorは、要素がstd :: vectorの型の外にあるため、問題を回避できます。
于 2012-10-08T16:58:47.920 に答える