【发布时间】:2016-01-17 01:42:40
【问题描述】:
我想将函数参数中的框架(Mat对象)分配给对象变量,如下面的代码所示。这个函数应该被调用多次(对于来自摄像机的每一帧),但是这一行
this->nFrame = frame;
导致内存泄漏(注释时没有错误!)。
注意
setCurrentFrame 函数在 JNI 函数内部调用,其中 JNI 函数在每次我想处理来自摄像机的帧时被调用。
JNI 函数类似于:
JNIEXPORT jbyteArray JNICALL Java_com_adhamenaya_Native_run(JNIEnv * env,
jobject obj, jstring faceCascadeFile, jstring noseCascadeFile,
jstring landmarks, jlong frame) {
MyClass gsys;
cv::Mat& inFrame = *(cv::Mat*) frame;
gsys.setCurrentFrame(inFrame);
// SOME PROCESSING FOR THE FRAME
inFrame.release();
gsys.release();
......
......
}
C++函数(setCurrentFrame)的代码
void MyClass::setCurrentFrame(cv::Mat& frame) {
cv::Size2d imgRes;
float resRatio;
if (frame.cols > frame.rows) {
//landscape
imgRes.width = 640.0f;
resRatio = frame.cols / 640.0f;
imgRes.height = floor(frame.rows / resRatio);
} else {
//portrait
imgRes.height = 640.0f;
resRatio = frame.rows / 640.0f;
imgRes.width = floor(frame.cols / resRatio);
}
//save scaled height, width for further use
this->frameWidth = nFrame.cols;
this->frameHeight = nFrame.rows;
//set frame and increment frameCount
this->nFrame = frame;
this->frameCount++;
}
请问您能帮我解决这个问题吗?我试图通过调用来释放框架:
void MyClass::release(void) {
this->nFrame = cv::Mat();
}
什么也没发生,即使是这样:
void MyClass::release(void) {
this->nFrame.release();
}
还是同样的错误!
编辑
MyClass.h
class MyClass {
public:
cv::Mat nFrame;
MyClass ();
~MyClass ();
void release (void);
void setCurrentFrame(cv::Mat& frame);
};
【问题讨论】:
-
@Miki 我已经编辑了问题。
-
您使用哪种工具来检测泄漏?
-
使用安卓adb。我对泄漏的信息很少,这条消息
10-18 21:57:59.399: A/libc(15001): Fatal signal 11 (SIGSEGV), code 1, fault addr 0x80000 in tid 15113 (Thread-8815)@RonaldoMessi
标签: android c++ opencv memory-leaks android-ndk