-4

重複の可能性:
動的メモリと「通常の」メモリの違い

私は C++ チュートリアルを読んでいましたが、動的メモリを宣言する必要がある理由がわかりません。チュートリアルには次のように書かれています。

これまで、すべてのプログラムで、変数に対して宣言した量のメモリしか使用できず、すべての変数のサイズは、プログラムの実行前にソース コードで決定されていました。

そして、動的メモリを使用するには new 演算子と delete 演算子を使用する必要があると書かれています。ただし、文字配列の長さを指定していない char* p などのポインターを宣言するときに、動的メモリを使用しているようです。実際、ポインターを使用するときは常に動的メモリを使用していると思いました。そうじゃない?new 演算子を使用して変数を宣言する場合とそうでない場合の違いがわかりません。動的メモリとは何かがよくわかりません。誰でもこれを説明できますか?

4

6 に答える 6

5

ポインターを使用するときは、常に動的メモリを使用していると思いました。そうじゃない?

いいえ、そうではありません。たとえば

int i;
int *p = &i; // uses a pointer to static memory, no dynamic memory.

ただし、文字配列の長さを指定していない char* p などのポインターを宣言するときに、動的メモリを使用しているようです。

char[100] string;
char* p = &(string[0]);  // Same as above, no dynamic memory.

データ構造に必要な大きさがわからない場合は、動的メモリが必要です。

ファイルからいくつかの int を読み取り、それらをメモリに格納する必要があるとします。必要な int の数がわかりません。100 の数値を選択することもできますが、101 があるとプログラムが壊れます。それで十分だと期待して 100,000 を選択することもできますが、ファイルに 10 しかない場合はリソースの無駄です。ファイル。

このシナリオでは、プログラムはファイルを反復処理し、int の数を数えてから、正しいサイズの配列を動的に作成できます。次に、int を新しい配列に読み込むために、もう一度ファイルを渡します。

静的 v の動的メモリ
静的メモリは、プログラムがコンパイルされると変更できないため、静的です。関数で宣言する変数、およびクラス/構造体で宣言されたメンバーは静的です。コンパイラは、各メソッドが呼び出されるときに必要になるそれぞれの数を正確に計算します。
動的メモリは、実行時に必要に応じてプログラムで使用できるメモリの「プール」です。コンパイラは、そのメモリの一部 (おそらく不明) を割り当て、そのメモリを解放して動的メモリ プールに戻す必要があることを認識しているだけです。

お役に立てれば。

PSはい、不明な数のアイテムをメモリに入れるより効率的な方法がありますが、これが最も簡単に説明できます

于 2012-04-19T12:40:09.330 に答える
3

あなたが持っているとき:

char* p;

p は char へのポインタ型の変数であり、p はスタックに格納されており、動的メモリを割り当てていません。

しかし、あなたがするとき:

p = new char[100];

サイズ 100*sizeof(char) の動的メモリ (ヒープ) の一部を割り当てました。

ヒープに割り当てられたメモリを解放する責任があります。

delete[] p;

スタックから変数を消去する必要はありません。変数がスコープ外になると、変数は自動的に削除されます。この例でpは、スコープ外になるとスタックから削除されます。

于 2012-04-19T12:36:18.360 に答える
2

C ++の動的メモリは、new演算子を使用してオペレーティングシステムのヒープに割り当てられたメモリです。大きすぎてスタックに割り当てることができないオブジェクトを割り当てる必要がある場合、またはマルチスレッド環境でスレッドの1つに割り当てられたメモリを異なるスレッド間で共有する必要がある場合は、動的メモリが必要です。ポインタは、動的メモリポインタを使用することを意味するものではなく、スタック内のオブジェクトに関連するスタックアドレスを含めることもできます。

于 2012-04-19T12:37:16.120 に答える
2

実際、ポインターを使用するときは常に動的メモリを使用していると思いました。そうじゃない?

いいえ。スタック割り当て (「自動」) メモリへのポインタは次のとおりです。

{
    int i;
    int *p = &i;
}
于 2012-04-19T12:32:11.317 に答える
2

動的メモリは、スタックに自動的に割り当てられるのとは対照的に、プログラマが明示的に要求する必要があるメモリです。

動的メモリには、スタック フレーム (関数呼び出し) 間で永続的であり、さまざまなサイズにすることができるなど、多くの利点があります。

スタック上では、配列は特定のサイズになります。

int ar[5];

ただし、要素が 10 個の場合は実行できません。解決策は、メモリを動的に割り当てることです。

size_t sz;
std::cin >> sz;
int *i_p=new int[sz];

つまり、動的に割り当てられたものはすべて解放する必要があります (C++ では delete を使用)。

delete i_p;

ただし、可能であれば、std::vector などの動的配列へのラッパーを使用する方が一般的には優れています。

size_t sz;
std::cin >> sz;
std::vector<int> vect(sz);

これにより、メモリが自動的に管理され、アレイへの便利なインターフェイスが提供されます。

于 2012-04-19T12:34:35.277 に答える
2

ユーザーから不明な数の整数を読み取りたいとしましょう。たとえば、 を宣言しint numbers[100]、ユーザーにいくつの数値があるかを尋ねることができます (これは variable に格納されているとしましょうn)。ユーザーが 100 より大きい数値を入力した場合は、エラーを報告するしかありません。または、すべての数値に十分なスペースを書き込んint *numbers = new int[n]で割り当てることもできます。

于 2012-04-19T12:34:35.360 に答える