C言語で作ったプログラムのプロセス終了時にメモリを自動開放するテクニックを思い出したので備忘録。
なお、FastCGIのようなプロセス常駐が前提のプログラムは対象外で…
参考にはなると思いますf(^^;
図示すると、このようなケースの場合

どこでメモリ開放するか?
外部処理なので外部処理の中で開放するのが良さそう…というところまでは同意してもらえると思うのですが、外部処理が終わったから開放処理を呼ぶとなると、このようになってしまう。

で、呼び出し元から開放処理を呼び忘れる…
なので、開放処理の呼び忘れ対策を入れておくと安心ですよという話。

ただし、プログラム中で exit 関数を呼び出すと atexit 関数でスタックした処理が呼ばれないので注意です。
プロセス常駐型のプログラムの場合も atexit 関数の考え方を応用すれば、Javaのガベージコレクタに近い実装が出来ると思うので、設計してみるのも面白いと思います。
こんな感じのコードを実行すると

destructorを明示的に呼び出していないのだけれど、main関数が終わったタイミングで、atexit 関数でスタックしておいた処理が呼ばれるよという話でした。

コメント