現在の関数が終了する前に、C の alloca() によって割り当てられたメモリを明示的に解放することは可能ですか? もしそうなら、どのように?
8 に答える
http://www.gnu.org/software/libc/manual/html_mono/libc.html#Variable-Size-Automaticから:
でのブロックの割り当て
alloca
は明示的なアクションです。必要な数のブロックを割り当て、実行時にサイズを計算できます。ただし、 alloca が呼び出された関数を終了すると、その関数で宣言された自動変数であるかのように、すべてのブロックが解放されます。スペースを明示的に解放する方法はありません。
可能ですが、事前に作成された関数はありません。コンパイラの alloca() の実装を詳しく調べて、それが何をしているのかを理解してから、独自の freea() を作成する必要があります。すべてのコンパイラが alloca() を異なる方法で実行するため、コンパイラごとに freea() を書き直す必要があります。
しかし、これが苦労する価値があるとは信じがたいです。明示的に解放する必要がある場合は、 malloc/free を使用してください。これらの関数は通常、大幅に最適化されています。それらを活用してください。
alloca(); を使用してスタックに割り当てています。後で何か他のことが起こった場合 (そして、すべてをアセンブリに書き込まないと制御できない場合)、スタックを単純に元に戻すことはできません。したがって、関数のスタック フレームを離れるまで、これは不可能です。
これが、割り当てられたバッファをオーバーフローさせた場合に本当に混乱を招く可能性がある理由でもあります。関数が返すコードのアドレスを上書きし始めて、他の場所にジャンプするなど、あらゆる種類の恐ろしいものを引き起こす可能性があります。気をつけて!
Malloc はヒープ上で動作するため、できることがはるかに柔軟になります。
これは、realloca ではなく継続渡しスタイル (CPS) に役立ちます。
スタックを文字列の長さに縮小して次の関数を呼び出す前に、スタックの一番上に文字列を割り当てて操作する関数を呼び出すことができます。
freea() が存在できないという概念的な理由はありません。これは、スタックの最上位のエントリ以外は nop になります。
いいえ、ローカル変数と共にスタックに割り当てられているためです。明示的に解放できるメモリが必要な場合は、動的メモリ割り当て関数のいずれかを使用します。
少なくとも標準では、明示的に解放し、関数の終了時に自動的に解放することを可能にするハイブリッドはありません。