1. ホーム
  2. c

[解決済み] Cメモリ管理

2023-01-19 01:19:25

質問

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 言語などでは、ヒープが勝手にクリーンアップされる、別の方法を採用している言語や環境もあります。ガベージコレクション」と呼ばれるこの方法は、開発者にとっては非常に簡単ですが、オーバーヘッドとパフォーマンスの面でデメリットがあります。これはバランスなのです。

(よりシンプルに、しかしできればより平易な回答をするために、多くの詳細を明らかにしました)