3

次のような変数を宣言するときとの違いについて少し混乱しています。

int n;

次のように、「new」を使用してメモリを変数に動的に割り当てます。

int m = new int;

ノード オブジェクトの形式で新しい値を挿入するとき、新しいノード オブジェクトを動的に作成し、目的の値をそれに追加してから、それを私のリストの残り。ただし、同じ関数で、別のノード オブジェクトを定義することもできます。ノードタイプ *N. このポインターを使用してリストをトラバースします。私の質問は..変数を宣言しただけで、メモリがすぐに割り当てられないのですか..それとも違いは何ですか?

ありがとうございました!

4

3 に答える 3

6

可能であれば、自動ストレージ割り当て変数を優先します。

int n;

以上

int* m = new int; // note pointer

あなたのケースで動的割り当てが好まれる理由は、リンクリストの定義方法です。つまり、各ノードには次のノードへのポインタが含まれています (おそらく)。ノードは、作成された時点以降に存在する必要があるため、動的に割り当てられます。

ノードタイプ *N. このポインターを使用してリストをトラバースします

はい、できます。ただし、これは単なるポインター宣言であることに注意してください。実際に使用するには、意味のあるものに割り当てる必要があります。

私の質問は..変数を宣言しただけで、メモリがすぐに割り当てられないのですか..それとも違いは何ですか?

実際には、どちらのケースも単なる宣言ではなく定義です。

int n;

初期化されていないint自動ストレージを作成します。

int* n;

へのポインタを作成しますint。ぶら下がっています。有効なメモリ位置を指していません。

int* n = new int;

ポインタを作成し、初期化されていない を含む有効なメモリ位置に初期化しintます。

int* n = new int();

ポインタを作成し、初期化された値int(つまり0) を含む有効なメモリ位置に初期化します。

于 2012-05-30T20:07:03.963 に答える
1

違いは、自動ストレージは、コンパイラがコンパイル時に必要なメモリの量と必要な期間を決定できる場合にのみ使用できることです。通常、自動変数はスタックに割り当てられます。

一方、動的に割り当てられるメモリの場合、プログラマーはこの情報を追跡する責任があります。これは通常、ヒープに割り当てられます。ヒープメモリを使用すると、通常、さまざまな理由でオーバーヘッドが大きくなり、ヒープメモリを割り当てても解放しない場合、メモリリークのリスクがあります。

リンクリストについて説明した例では、コンパイル時にリストの長さがわからない可能性があります(知っている場合は、静的配列を使用できます)。そのため、メモリを明示的に管理する必要があります。コンパイラにメモリ管理を自動的に処理させるよりも。ただし、関数が戻った後はリストをトラバースするために使用するポインターは必要ないため、コンパイラーによって自動的に管理できます。

于 2012-05-30T20:28:49.173 に答える
1
int m = new int; 

は実際には正しくありません。new作成したメモリへのポインタを返します。そのはず

int *m = new int;

そしてさらに良い:

int *m = new int();

m = 0 が指す変数の初期値を設定します。

また、あなたの質問に関しては、大きなオブジェクトは通常、ポインターを使用して作成され、関数から関数に値で渡されるときに大きなコピー操作を排除します。また、変数の寿命を関数のスコープよりも長くする必要がある場合にも使用されます。

ただし、関数のスコープで使用され、他の場所では役に立たない変数については、自動メモリを使用する必要があります

int m;
于 2012-05-30T20:06:36.953 に答える