2012-01-25 51 views
4

我已經發布了一些關於發佈所有IplImage和所有CvMat結構和CvMemStorage,但仍有一些內存問題。發佈內存opencv

我必須CvPointCvScalarCvPoint*(3個CvPoints陣,我一定要釋放的每個元素嗎?)

如果我不得不釋放所有這些東西,我怎麼也釋放?我沒有找到任何這樣做的功能。我在C/C++中使用OpenCV 2.1。

這是我如何聲明它們:

CvScalar b1; 
CvScalar f; 
float *data=(float*)resd->imageData; (need to release data) 
CvPoint *point; 
CvPoint pt; 
CvPoint* ptsCorner=(CvPoint*) malloc(3*sizeof(ptsCorner[0])); 

回答

5

這個問題比OpenCV的C更多。例如,這些:

CvScalar b1; 
CvScalar f; 
CvPoint pt; 

是局部變量,因此,當範圍{ }他們屬於執行完成後,它們會自動dealocatted。

此:

CvPoint *point; 

是一個指針,並在同一時間是一個局部變量。您不應該deletefree()它,因爲您沒有通過newmalloc()爲它分配任何內存。這樣做會導致你的問題(可能是崩潰)。

另一方面

但是data

float *data = (float*)resd->imageData; 

是一個指針和局部變量保持的存儲器塊。但是,在這種特定情況下,delete[] data;free(data)並不明智,因爲您沒有直接分配此內存。很顯然,這個內存被分配爲resd的一部分,這意味着你必須檢查代碼並找出變量resd是如何被聲明/初始化的,然後執行相應的過程來釋放它。由於我知道一個關於OpenCV的小問題,我可以說resd是一個IplImage*。如果您使用cvCreateImage()來創建此變量,那麼您也可以使用cvReleaseImage()來釋放它。

最後:

CvPoint* ptsCorner=(CvPoint*) malloc(3*sizeof(ptsCorner[0])); 

它的動態內存分配,在那裏你特別分配的內存量的tipical情況。由於ptsCorner是一個局部變量和一個指針,當它所屬的作用域結束執行時,你將失去對該內存塊的引用,並且它將簡單地丟失在你的RAM中,引起內存空間並導致泄漏。不用說,在這種情況下,您必須執行free()來取消分配內存。

1

如果要初始化使用然後是你需要調用刪除(或刪除[],如果它是一個數組的CVPoint結構)以避免內存泄漏。

如果不是那麼當函數超出範圍時,變量將被自動銷燬。

如果你發佈你的代碼,那麼它會更容易看到。

+0

添加聲明,所有的代碼是非常長的,但我認爲現在更清楚,順便說一句我不使用新的,所以我想我必須釋放只是浮動*數據(我嘗試刪除,但我得到一個運行時錯誤)和* ptsCorner – andrea

+0

在使用malloc的地方,您將需要使用free()來回收內存。要小心它是否是數組,因爲您需要在數組的每個成員上調用free()。大量的教程如何做到這一點 – TomP89

0

我認爲解決你的問題的最好方法是閱讀一個關於指針的好教程。

這裏是一個http://www.cplusplus.com/doc/tutorial/pointers/

你說什麼有問題OpenCV的,其實是缺乏編程語言的理解。所以,從基礎開始,廣告繼續!