既に解放済みのIplImageを解放しようとcvReleaseImageをしようとした時にこのエラーが出てしまった。
cvRelease系はいまだに謎が多い。
実際に遭遇したケースでは、
ClassA {
…略
public:
void func();
};
void func() {
IplImage* test;
ClassB obj(test);
obj.func();
cvReleaseImage(&test);
}
ClassB {
…略
public:
ClassB();
~ClassB();
};
ClassB::ClassB(IplImage* image)
:image(image){
}
ClassB::~ClassB() {
cvReleaseImage(&image);
}
といった感じでClassBで既に使用済みにしていたのに、
ClassAで解放しようとしたケース。
class呼び出し元に影響を与えないようにするには、
初期化の際に
ClassB {
public:
ClassB();
~ClassB();
};
ClassB::ClassB(IplImage* shoki) {
image = cvCreateImage(cvGetSize(shoki),IPL_DEPTH_8U,3);
cvCopy(shoki,image,0);
}
ClassB::~ClassB() {
cvReleaseImage(&image);
}
等として別にIplImage領域を確保しておいてコピーするか、
そもそもcvReleaseImageを行わないかしないといけないようだ。
後者は何となくメモリリークしてて恐いが、実際どうなのだろう?
最終更新:2011年04月03日 18:57