cvMatのクリッピング時に発生するメモリリークの原因を知りたい
現在発生中のメモリリークの根本的な原因が知りたいです。
C++のOpenCVメソッドを使った画像処理DLLでメモリリークが発生しました。
発生個所は、メンバ変数のcvMatから引数として渡されたROIを用いてクリッピングを行う箇所でした。
対象コードは載せられませんが、以下のような処理になっています。
int func(Rect roi){
// something ...
Mat clip = m_img(roi);
// something
}
このコードが含まれるDLLは、最上部のC#コードからCLIを通して呼ばれる構造になっています。
そして、funcメソッドを繰り返し呼び出すことでメモリリークが発生しました。
ただしこの問題は現在解決しており、clipをreleaseすることで問題の解決に至っています。
私の疑問点は
m_img(roi)ではデータのコピーが発生しないはずなのに、どうしてメモリリークが発生したか
ということになります。
私が調べた限りでは
- m_img(roi)ではデータのコピーは発生しない cvMatのリファレンス
- m_img(roi)では新しいヘッダは作成される OpenCVのメモリ管理に関するドキュメント
- 同じブロック内でサイズの異なるクリッピングを行うときは開放したほうが良い? StackOverflowの回答
私の推測ではありますが
スタック領域に溜まっていくヘッダデータを、ある程度溜まってから解放しようとしているために発生している問題
だと考えていますが、確証が持てません。
この原因について何かご存知の方はおられますでしょうか?
環境
OpenCV 3.4.3
Visual Studio 2015
Windows 7
以上よろしくお願いします。
更新
今日まで調査を進めた内容を以下に示します。
- CLIで行っている Iplimage* -> Mat への変換でUmatの情報がほぼ欠落した状態になる
→上記変換はcvarrToMatを使用している
- C++コードのみを取り出して連続実行してもメモリの使用量には変化は見られない
- 画像サイズよりは小さい増加量なので画像のコピーは行われていない