「ヒープ領域のメモリを使う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);
関連
-[[動画シリーズ コーナーの検出]]
-[[動画シリーズ]]
-[[ビデオのwhile(1){ }の繰り返しがあるコードの注意点>http://www40.atwiki.jp/chugoku/pages/90.html]]
#comment
「今日の訪問数:&counter(today)」
「昨日の訪問数:&counter(yesterday)」
「今までの訪問数:&counter(total)」