C で変数 (長い文字列など) に使用したメモリを解放するにはどうすればよいですか?
5 に答える
メモリを動的に割り当てたと仮定すると (malloc
または別のメモリ アロケータを使用して)、 を使用してメモリを解放しfree
ます。メモリが静的に割り当てられた場合、解放することはできません。
この質問は、より多くの情報なしでは本当に答えることができません。オブジェクトを解放する方法を知る(または解放する必要があるかどうかを知る)唯一の方法は、オブジェクトがどのように割り当てられたかを知ることです。
そして、私がオブジェクトと言うとき、私はC ++の「オブジェクト」だけでなく、C標準で使用されている「オブジェクト」を意味します。
実行環境のデータストレージの領域。その内容は値を表すことができます。
変数をどのように宣言するかに大きく依存します-通常の変数の場合、メモリを「割り当て解除」できません-次のようにスコープ外になると解放されます。
for (int i=0;i<10;i++) {
int k=i;
//do stuff
}
ループを終了すると i の割り当てが解除され、ループの本体を通過するたびに k が割り当てられ、割り当てが解除されます。
ランタイムメモリの割り当てについては、信頼できるmallocとfreeを使用できます:)
int* intArray;
malloc(200 * sizeof(int));
これにより、200 int の配列が得られます。
malloc を使用しておらず、次を使用して文字列またはバッファを作成しているとします。
char array[100];
しかし、長い関数の非常に短い部分にしか使用していないことがわかっています。関数のその部分を { } の別のセットに配置するだけです。
int reallylongfunction() {
// Do a lot of stuff
{
char stringbuffer[100];
// Do stuff with the buffer...
// Ok, we're done with the buffer, and don't want it anymore
}
// Do a lot more stuff
return;
}
これにより、バッファが範囲外になり、解放されます。ただし、余分な { } 内で宣言したものはすべてスコープ外になり、同様に消えてしまうことに注意してください。
編集:くそー、コメントは正しいです。範囲外の静的文字列は何の役にも立ちません。単なる配列になるように編集しました。
ustrをご覧になることをお勧めします。これは、自動、定数、および動的に割り当てられた文字列で使用できる文字列 API です...実際に「解放」できるのはそのうちの 2 つだけですが、そのすべてを扱うことができます。同じ方法で ustr_free() に渡します。
スタック、ヒープ、およびデータ (RO テキスト文字列) がどのように「割り当て」および「解放」されるかについては、まだ学習したいかもしれませんが、学習中に使用可能な API を使用すると、多くの場合に役立ちます (自分で行うよりもはるかに高速になります)。