2012-04-19 8 views
-5

可能性の重複:
Differences between dynamic memory and “ordinary” memoryダイナミックメモリとは正確には何ですか?

私はC++チュートリアルを読んでいたと私は動的メモリを宣言する必要がある理由私は理解していない、これはチュートリアルが言うことである:

これまでのところ、私たちのすべてのプログラムでは、私たちが変数として宣言したものの、ソースの中ですべてのサイズが決まるプログラムの実行前に、コードを実行します。

そして、動的メモリを使用するには、新しい演算子と削除演算子を使用する必要があると言われています。しかし、ポインタを宣言するときにダイナミックメモリを使用しているようです。 char * pは、文字の配列の長さを指定していません。実際には、ポインタを使用するときに常にダイナミックメモリを使用していると思いました。それは本当ですか? 私は、new演算子を使って変数を宣言するかどうかの違いは分かりません。私はダイナミックな記憶が本当に理解できません。誰も私にこれを説明することはできますか?

+0

http://stackoverflow.com/questions/3930013/stack-overflow-static-memory-vs-ダイナミックメモリ –

+0

http://stackoverflow.com/questions/2300191/dynamic-memory-allocation-question –

+0

http://stackoverflow.com/questions/1699057/why-are-two-different-concepts-both-called-ヒープ –

答えて

5

ポインタを使用すると、常に動的な のメモリが使用されていると思いました。それは本当ですか?

ありません、それはしかし、私は例えば 、ポインタを宣言するときに動的メモリを使用しているように見える例

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

のために、真実ではありません私は文字

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

の配列 の長さを指定していないためのchar * pは、あなたがデータ構造があることが必要どのように大きな言うことができないダイナミックメモリを必要としています。

ファイルからintを読み込んでメモリに格納しているとします。どれくらいの知識が必要か分かりません。あなたは100の数字を選ぶことができますが、101があればあなたのプログラムは壊れてしまいます。十分に期待して100,000を選ぶことができますが、ファイルに10しかなければリソースの浪費で、100,001のintがあれば壊れますファイル。

このシナリオでは、プログラムはファイルを反復処理し、整数の数を数え、次にを動的にのサイズの配列に作成します。その後、ファイルを2回目に渡してintを新しい配列に読み込みます。プログラムがコンパイルされると、それはそれは静的で、変更することはできませんので

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

これが役に立ちます。

P.S.はい、メモリに未知数のアイテムを取得するより効率的な方法がありますが、これは説明するのが最も簡単です

2

実際、私はあなたが常に動的メモリを使用しているポインタを使用すると思っていました。それは本当ですか?

号は、ここでメモリスタック割り当てする(「自動」)ポインタは次のとおり

{ 
    int i; 
    int *p = &i; 
} 
2

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

ダイナミックメモリには、スタックフレーム(関数呼び出し)間で永続性があり、サイズがさまざまであるなど、多くのメリットがあります。

スタック上の配列は、非常に特定のサイズのもの:あなたは10要素、あなたがそれを行うことができない場合

int ar[5]; 

はしかし、解決策は、メモリを動的に割り当てることです。

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

そのようなスタンダード::ベクトルとして動的配列のラッパーを使用することが可能な場合、一般的に良好であるが、動的に割り当てられたすべてが

delete i_p; 

(削除使用してC++で)解放されなければならない言った

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

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

2

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

3

お持ちの場合:

char* p; 

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

しかし、あなたが行うとき:

あなたはサイズ100 *はsizeof(文字)の動的メモリ(ヒープ)の一部を割り当てた
p = new char[100]; 

あなたはヒープ上に割り当てられたメモリを解放する責任がある:

delete[] p; 

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

2

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