ヒープ領域のメモリを使うmalloc的な関数の使用上の注意

「だんだん重くなる」場合は、タスクマネージャ(ctrl+alt+delete)のメモリが一方的に増えていないか確認すること。
C言語ではブロック {   }の中で宣言した変数はスタック上に作られる。
{  }を抜ければスタックの巻き戻しをして{  }に入る前の位置までスタックが指すポインタは巻戻っている。
だから、スタックの使用領域は増えない。(自動変数)
一方、mallocな関数はヒープ領域といって実行時に動的にメモリを使ったり、開放したりするメモリの領域。
この領域は開放しないと再利用できない(スタックは自動的に巻き戻しがおこるが)。
そのプロセスが終了するときにはOSが開放してくれるが、長く動くサービスのようなアプリケーションは通常「固まる」「重い」症状がでる。
そのため、タスクマネージャで動作を確認し解決すべきだ。


OpenCVの関数名に
create
clone
load
alloc
を含むと疑おう。
メモリーリークの問題にぶちあたらないようにコンパイル、実行したらタスクマネージャでメモリを監視しよう。

このような関数を使ったら
release
free
を使おう。

メモリ解放済みの変数を解放てもエラーにならない。
ただし、
NULLを開放しようとすると Bad argument のエラーのメッセージボックスがでる。

また、cvReleaseeImageなんかはポインタのポインタ。freeはポインタが引数。
void cvRelease( void** struct_ptr );
void cvReleaseMemStorage( CvMemStorage** storage );
void cvReleaseImage( IplImage** image );
void free(void *ptr);//これはCのstring.hのライブラリ関数

終了後固まる場合はカメラの開放ができていないことがおおい。
cvReleaseCapture(&capture);

関連
名前:
コメント:
「今日の訪問数: -
「昨日の訪問数: -
「今までの訪問数: -
最終更新:2010年02月05日 15:33
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。