2013-07-11 114 views
1

我讀了OpenCV的教程和它下面說一下OpenCV的形象holder類(CV :: MAT):如何通過引用返回對象?

The cv::Mat class implements reference counting and shallow copy such that when an image 
is assigned to another one, the image data (that is the pixels) is not copied, and both images 
will point to the same memory block. This also applies to images passed by value or returned 
by value. A reference count is kept such that the memory will be released only when all of the 
references to the image will be destructed. 

我在那說This also applies to images passed by value or returned.部分specficially感興趣怎麼可能指向當它通過值傳遞相同的內存塊?我覺得這與重載=運營商有關。但它表示,即使圖像被返回,它也只會返回一個指向同一個內存塊的圖像,而不會創建一個新的圖像。我不明白他們是如何實現這一點的。

但這裏是我明白:

按值由於通和恢復的圖像做出新的圖像共享相同的內存塊,它是有道理的實現引用計數。

但是,你能解釋一下如何共享內存塊,即使當一個對象被返回或通過值傳遞?

回答

2

這是相對容易的:在類的構造函數中,您分配內存,例如使用new。如果製作一個對象的副本,則不會每次都分配新的內存,而只是將指針複製到原始內存塊,同時遞增也存儲在內存中的引用計數器,以使每個對象有權訪問它。銷燬對象將減少引用計數,並且只在引用計數降至零時釋放分配的內存。

自定義拷貝構造函數和賦值運算符就是您所需要的。

這基本上是共享指針的工作原理。

1

它可以像cv::Mat一樣簡單,具有指向動態分配的內存塊的共享指針。當您複製Mat實例時,您將複製共享指針(遞增引用計數),而不是它指向的資源。

1

多個cv::Mat s可以共享相同的數據數組,但具有不同的標題。有一個計數器可以計算出使用這個數據陣列的墊子數量。當計數器返回0時,數據數組被釋放。或者它會一直存在。此外,CvMat,MatIplImage可以沒有問題地共享相同的數據陣列。它們之間的唯一區別是標題。

1

如何通過值傳遞 指向同一個內存塊?

cv :: Mat結構實際上管理着一個動態分配的內存位置。它只是一個指向這個位置的指針,並且攜帶有關矩陣屬性的信息。當你按值傳遞這個變量時,你只需複製這個指針並且不會複製動態內存。爲了深層複製cv :: Mat的所有元素,有一個方法叫copyTo()