我對以下案例有些困惑。我有以下C++類,代表一個RGB像素:C++類的成員對象:它應該在哪裏被銷燬?
class RgbColorVector
{
cv::Mat pM;
public:
RgbColorVector(unsigned int r,unsigned int g,unsigned int b)
{
pM = cv::Mat(3,1,CV_8UC1);
pM.at<unsigned char>(0,0) = r;
pM.at<unsigned char>(1,0) = g;
pM.at<unsigned char>(2,0) = b;
}
unsigned int getComponent(int c)
{
return (unsigned int)pM.at<unsigned char>(c,0);
}
在這裏,我使用OpenCV的墊對象保存一個RGB值。通常在這種情況下,我會使用cv :: Mat指針,並使用new運算符在構造函數中分配堆內存,然後使用delete將其釋放到析構函數中。在上面的例子中,我明確地調用了cv :: Mat的構造函數。我期望的是當RgbColorVector的構造函數退出時,cv :: Mat構造函數中分配的內存將被銷燬。但顯然情況並非如此:
void func()
{
RgbColorVector rgbVec(105,42,45);
int g = rgbVec.getComponent(1);
std::cout<<g<<std::endl;
}
int main(int argc, const char * argv[]) {
func();
return 0;
}
在這裏,我得到的輸出42.我知道,「rgbVec」是本地(自動)變量,並在「功能」退出,其內容(類成員)將被銷燬。但是,我期望getComponent()調用將返回一個隨機值,因爲在cv :: Mat構造函數調用中分配的任何內存將在「rgbVec」構造函數返回後被銷燬。我在這裏有點困惑,在這種情況下內存分配機制究竟如何工作?是不是在RgbColorVector()構造函數的堆棧中分配cv :: Mat對象?
我不明白你會期待什麼樣的行爲。你正在通過pM = cv :: Mat(3,1,CV_8UC1)使用cv :: Mat的複製構造函數;所以構造的對象在你的類成員變量中(如果類對象被銷燬,它將被銷燬),它在func()的末尾。另外,如果你確實會訪問釋放內存,則不會返回「隨機」值,而是返回內存中的值。如果內存仍然屬於你的程序並且沒有被覆蓋,你甚至可能會觀察到「正確」的值,如果你不小心釋放了內存。 – Micka
使用Mat來存儲單個像素值的想法非常糟糕。你最好使用Vec3b,或者只使用3個UI – Miki