1. 程式人生 > >Opencv:IplImage*轉Mat後的記憶體洩露問題

Opencv:IplImage*轉Mat後的記憶體洩露問題

用Windows的API獲得一個BMP的控制代碼,並將其轉換到IplImage格式,然後再轉到Mat型別。但在這裡注意到會發生一個記憶體洩露的問題,記錄下來。
Mat型別預設是淺拷貝,深拷貝需要在建構函式中加入true標識。

Mat a = Imread("pic.bmp");
Mat b = a;//淺拷貝,a和b公用一塊資料
Mat b = Mat(a,true);//深拷貝,b將複製a的內容

IplImage型別是一個結構體,其指標所指向的內容可以作為Mat型別的構造引數。

...
IplImage* p = hBitmapToIpl(hbmp);
Mat temp = Mat(p);
return
temp;

在temp返回的值賦予的變數離開其作用域時,會呼叫解構函式,釋放其擁有的空間,但並不會釋放p指向的那一塊空間,因為p非智慧指標,其指向的區域除非手動釋放,否則將會一直存在於程式中。因此此處應使用深拷貝:

IplImage* p = hBitmapToIpl(hbmp);
Mat temp = Mat(p, true);//深拷貝 因為p的內容不會被M釋放掉 存在記憶體洩露
cvReleaseData(p);