0

最初に次のように始めたとしましょう:

int *newArray = new int[1];

そして後で次のようなものがあります:

ifstream inputFile("File.txt");

Counter=0;

while (inputFile >> newValue)
{
    newArray[Counter] = newValue;
    Counter++
}

テキストファイルから100行をプルしようとすると、プログラムは最終的にクラッシュします。しかし、私が使用した場合

int *newArray = new int[100];

元々、クラッシュしません。

動的にメモリを割り当てる場合、なぜ1より大きい初期値が必要なのですか?それは私には意味がありません。1や10などの小さな数を超える初期長を定義する必要があると、動的メモリ割り当ての目的全体が無効になります。

編集:これは学校用です。まだベクターを使用することは許可されていません。

4

3 に答える 3

4

言語はあなたのために「動的にメモリを割り当てる」ことはありません。アレイのサイズが目的に十分になるように、アレイを割り当てて再割り当てするのはユーザーの責任です。

C ++の「動的割り当て」の概念は、メモリが何らかの形で自動的に割り当てられることを意味するものではありませんでした。このコンテキストでの「動的」という言葉は、新しいオブジェクトのパラメーターと存続期間が(コンパイル時ではなく)実行時に決定されることを意味します。動的メモリ割り当ての主な目的は、1)オブジェクトの存続期間を手動で制御すること、2)実行時に配列サイズを指定すること、3)実行時にオブジェクトタイプを指定することです。

2番目のポイントはあなたがこれを行うことを可能にするものです

int n = ...; // <- some run-time value
int *array = new int[n];

これは、動的に割り当てられていないアレイでは不可能です。

あなたの例では、最初にサイズが1の場合、配列を割り当てることができます。何も悪いことではありません。ただし、新しいより大きなアレイを割り当て、データを新しいアレイにコピーし、アレイにさらにスペースが必要になったときに古いアレイを解放するのは、依然としてユーザーの責任です。

このような煩わしさをすべて回避するには、ライブラリが提供するサイズ変更可能なコンテナを使用する必要がありますstd::vector

于 2012-12-06T02:48:34.683 に答える
1

動的にサイズを変更できるという意味で動的ではありません。サイズはコンパイル時ではなく実行時に動的に選択できるという意味で動的です。C ++の主要な哲学の1つは、使用しないものに対して料金を支払わないことです。動的配列があなたが求めているように機能した場合、境界チェックが必要になりますが、これは私には必要ないので、お金を払いたくありません。

とにかく、問題は標準ライブラリで解決されます。

std::vector<int> vec;
...
while (inputFile >> newValue)
{
    vec.push_back(newValue);
}

そんなにいいじゃないですか。ベクトルがサイズを追跡するため、サイズを追跡する必要はありません。

ベクトルを使用できない場合は、多くの作業が必要になります。原則は本質的にこれです。2つの追加の整数変数を保持します。1つは配列で使用している値の数を示し、もう1つは配列の現在の容量を示します。部屋が足りなくなると、より多くのスペースを割り当てます。たとえば、これは貧乏人の例外ではない安全なバージョンのベクトルです。

int size = 0;
int capacity = 1;
int array = new int[capacity];

while (inputFile >> newValue)
{
    if (size == capacity)
    {
        capacity *= 2;
        int * newArray = new int[capacity];
        for (int i=0; i<size; ++i)
            newArray[i] = array[i];
        delete [] array;
        array = newArray;
    }
    array[size++] = newValue;    
}
于 2012-12-06T02:48:27.713 に答える
0

1つだけのスペースを作成していますがint、複数を保存しようとすると、もちろんクラッシュします。サイズ100で作​​成した場合でも、101番目の値を保存しようとするとクラッシュします。

コンテナの自動サイズ変更が必要な場合は、チェックアウトしてくださいstd::vector

#include <vector>

std::vector<int> data;

while (inputFile >> newValue)
{
    data.push_back(newValue);
}

これは、プロセスのメモリがなくなるまで機能します。

于 2012-12-06T02:47:06.427 に答える