メモリフラグメンテーション

今回は、画像処理に直接からむ話ではありません。

目下、他人様が以前に作った画像処理ソフトのメンテナンスをやらなければならなくなり、
メモリ関連の不具合で苦心しているところです。

症状

症状は、長時間実行しているとメモリ取得エラー(C++:new 演算子が 例外を送出するようになる。)を発生するという、
ある意味典型的なものです。

メモリリークですよね?ふつうー

まず最初に想定すべき原因はメモリリークです。デバッガで調べると確かに幾つか少量のリークが見つかりました。
「実装継承を伴うクラスに、仮想デストラクタがない!」などという、C++初心者のようなコーディングミスも
からんでいたりして、結構鬱になります。
これらを全て修正して、再度長時間試験を行いました。

治っていません

しかし、症状は改善しません。やはりメモリ取得エラーで落ちるのです。
タスクマネージャで見ると、そのときシステム全体ではまだまだたくさんメモリが余っています。
つまり、メモリリークによってメモリ不足に陥って落ちているわけではなさそうです。

Javaかよ!なコーディング

メモリ取得エラーの発生源から逆算して、どういうことになっているのかソースを詳しく解読してみました。
すると、むむむっ!なんだこのコーディングは!と叫んでしまいそうになりました。まるで Javaのようなコードスタイルです。
上位から下位まで、あらゆる階層の関数でオブジェクトや配列を必要なときに newしてdeleteしています。
画像バッファから小さな構造体までなんでもその場で new, new, new。
newしたオブジェクトの寿命(生存期間)もばらばらです。
なるほど、これはメモリフラグメンテーションフラグメンテーション - Wikipedia)を起こしているのにほぼ間違いありません。
というか、メモリフラグメンテーションのテストプログラムみたいだ(笑)。

メモリフラグメンテーションの解消

長くなってきたので、次回につづけます。