2012-02-02 12 views
2

関数内に配列を宣言すると、その関数を残したときにメモリが割り当て解除されますか?C++ - 関数内で配列を宣言する

しかし、関数内に配列を宣言するときは、配列へのポインタをグローバル変数に書き込んだ後、(関数の外で)その要素のポインタを逆参照しようとします。配列、私はメモリアクセス違反を取得します。関数内で同じコードを使用すると、メモリアクセス違反が発生しません。

明確化が大いに評価されます。

ありがとうございます。

答えて

2

関数で宣言された配列は、プログラムスタックに割り当てられます。プログラムが関数を終了すると、スタックのローカル変数がポップされ、配列を含むメモリにアクセスできなくなります。代わりに新しいは、プログラムヒープ上に割り当てられた配列ポインタであり、関数終了時に生き残り、後ででなければなりません。 'またはメモリリークが発生します。

プログラムスタックの一般的な説明は、関数のローカル変数を保持するためのメモリブロックです。関数が呼び出されると、関数のローカル変数を保持するのに必要なメモリ量がスタックの先頭にプッシュされます。つまり、スタックポインタがその分だけ移動します。関数が終了すると、その正確な量のメモリがスタックの先頭からポップされ、スタックポインターは関数呼び出しの前に元の位置に戻る。一方、プログラムヒープはスタックセマンティクスを持たないメモリであり、関数がの新しいメモリブロックを要求したときに使用されます。プログラムはそのメモリの解放を管理します。

Smart pointersは、メモリ管理に関連するバグやメモリリークを避けるために、メモリの割り当てと割り当て解除を自動的に処理するためにC++でよく使用されます。

速いグーグルがthis explanation of stack versus heap in C++を投げた。

+0

ありがとうございました!私は私がしたエンジニアリング・プログラミング・コースでヒープとスタックを紹介しましたが、私はその違いを理解していません。あなたは良い資源の方向に私を説明したり、指摘したりできますか?再度、感謝します! – JonaGik

+1

@JonaGik:http://stackoverflow.com/q/79923/10077を参照してください。 –

+1

システム内の各変数をプレートと考えてください。関数を入力すると、パラメータとローカル変数がプレートのスタックに追加され、ダーティになって使用されます。機能を残しておくと、プレートを掃除する必要があるため、シンクに投げ込まれます。ヒープは、名刺(アドレス)を持つテーブルのようなものです。あなたはテーブルに新しいプレートを置くことができます。誰でも名前を知っていれば誰でもそれを使うことができますが、最終的には削除してから自分で掃除する必要があります。誰も乱雑なテーブルを好きではありません:-) – Joel

4

すべての自動変数は、配列を含む関数の終了後に削除されます。これは、一般にすべての非静的ローカル変数になります。

+3

*すべての自動*変数が存在しなくなりました。ローカル変数は 'static'でもかまいません。その場合、その寿命は単一の関数呼び出しを超えています(実際にはプロセスの終了まで)。 –

+0

あなたは正しいです。編集されました。 – Joel