[解決済み] Cメモリ管理
質問
C言語では、メモリの管理に気をつけなければいけないといつも聞いています。そして、私はまだCを学び始めていますが、これまでのところ、私はメモリ管理関連の活動をする必要が全くありません。私はいつも、変数を解放したり、いろいろと醜いことをしなければならないことを想像していました。しかし、これはそうではないようです。
どなたか、quot;メモリ管理を行う必要がある場合の例を(コード例で)教えていただけませんか?
どのように解決するのですか?
変数がメモリ上に置かれる場所は2つあります。このように変数を作成すると
int a;
char c;
char d[16];
変数は、"で作成します。 スタック "に作成されます。スタック変数はスコープの外に出ると(つまり、コードがそれ以上到達できなくなると)自動的に解放されます。自動変数と呼ばれているのを聞いたことがあるかもしれませんが、これはもう流行遅れです。
多くの初心者の例では、スタック変数のみを使用します。
スタックは自動的なのでいいのですが、2つの欠点もあります。(1) コンパイラはあらかじめ変数の大きさを知っておく必要がある、(2) スタックスペースが多少制限される。たとえば、Windows では、Microsoft 社のリンカーのデフォルト設定では、スタックは 1 MB に設定されており、そのすべてが変数に使用できるわけではありません。
コンパイル時に配列の大きさがわからない場合、または大きな配列や構造体が必要な場合は、"プラン B"が必要です。
プランBは、".B"と呼ばれます。 ヒープ "です。通常、オペレーティングシステムが許す限り大きな変数を作成することができますが、自分自身でそれを行う必要があります。以前の投稿では、他の方法もありますが、あなたがそれを行うことができる1つの方法を示しました。
int size;
// ...
// Set size to some value, based on information available at run-time. Then:
// ...
char *p = (char *)malloc(size);
(ヒープ内の変数は直接操作するのではなく、ポインタを介して操作することに注意)
一旦ヒープ変数を作成すると、問題はコンパイラがいつその変数が終わったかを判断できないため、自動解放ができなくなることです。そこで、あなたが言及した「手動解放」が登場するのです。あなたのコードは、その変数がいつ不要になったかを判断し、その変数を解放して他の用途にメモリを使えるようにする責任があるのです。上記の場合、with:
free(p);
この2番目のオプションが厄介なのは、変数がいつ不要になるかを知るのが必ずしも容易ではないことです。不要になったときに変数を解放するのを忘れると、プログラムが必要以上にメモリを消費してしまうことになります。このような状況を「リーク」と呼びます。リークしたメモリは、プログラムが終了してOSがリソースを回復するまで、何も使用することができません。間違ってヒープ変数を解放してしまうと、さらに厄介なことになります。 前に の前に誤ってヒープ変数を解放してしまうと、さらに厄介な問題が発生します。
CやC++では、上記のようにヒープ変数をクリーンアップするのは自分の責任です。しかし、Java や C# などの .NET 言語などでは、ヒープが勝手にクリーンアップされる、別の方法を採用している言語や環境もあります。ガベージコレクション」と呼ばれるこの方法は、開発者にとっては非常に簡単ですが、オーバーヘッドとパフォーマンスの面でデメリットがあります。これはバランスなのです。
(よりシンプルに、しかしできればより平易な回答をするために、多くの詳細を明らかにしました)
関連
-
error: 'for' loop initial declaration is only allowed in C99 mode 原因と解決方法
-
C/C++の再定義
-
[解決済み] MIPSのネストされたForループと配列の使用
-
[解決済み] ソケットアクセプト - "開かれているファイルが多すぎる"
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] Androidでアプリケーションのメモリ使用量を確認するにはどうすればよいですか?
-
[解決済み] アプリケーションやプロセスの実際のメモリ使用量を測定するにはどうすればよいですか?
-
[解決済み] C言語で関数をパラメータとして渡すにはどうすればよいですか?
-
[解決済み] Pythonで明示的にメモリを解放するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
C 構造体定義エラー: '['トークンの前に一次式があることが予想される
-
libc++abi.dylib: NSException タイプの捕捉されない例外で終了するエラー
-
[解決済み] 初期化でポインタ対象の型から修飾語を捨てる
-
[解決済み] stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み] CコードでEOFを表現する?
-
[解決済み] C言語で関数型プログラミングを行うためのツールにはどのようなものがありますか?
-
[解決済み] while ( !feof (file) ) 」は、なぜいつも間違っているのですか?
-
[解決済み] longをフォーマットするprintfの引数は何ですか?
-
[解決済み] C言語でファイルが存在するかどうかを確認する最も良い方法は何ですか?
-
[解決済み] なぜ16進数には0xがつくのですか?