2013-06-01 147 views
0

下面的代碼根據我如何定義newImagesData給出了seg.fault(參見下面的註釋)。如果是數組一切都OK,但如果定義爲指針 - 故障:(C++動態內存分配問題

//Mat newImagesData[FIFO_SIZE]; // Mat is a class from opencv 
Mat* newImagesData; 

void func1() 
{ 
    ... 
    newImagesData = (Mat*)malloc(FIFO_SIZE * sizeof(Mat)); //if *newImagesData 
    fifoInit(&newImagesFB, newImagesData, FIFO_SIZE); 
    ... 
} 

void fifoInit(FIFOBuffer* fifo, Mat* imageData, int size) 
{ 
    fifo->data = imageData; 
    fifo->end = 0; 
} 

void fifoWrite(FIFOBuffer* fifo, Mat* frame) 
{ 
    fifo->data[fifo->end] = *frame; // seg fault with *newImagesData ; OK with newImagesData[] 
    memcpy(&fifo->data[fifo->end], frame, sizeof(Mat)); // OK with *newImagesData 
    ... 
} 

如果我使用memcpy(),它工作正常 我能明白我做錯了任何幫助

回答

7

您不應該動態分配cv::Mat對象或使用malloc的數組,因爲它只爲對象分配空間,但不調用它們的構造函數(必須調用它才能實例化類型,如cv:Mat)。相應地,free將不會調用所需的析構函數

您應該使用new(與delete結合),或者最好使用標準庫結構,如std::vector(或C++ 14中的'std::dynarray')。例如,

std::vector<cv::Mat> newImagesData(FIFO_SIZE); 

std::dynarray<cv::Mat> newInagesData(FIFO_SIZE); // C++14 only 

然後可以使用newImageData,就像使用cv::Mat對象FIFO_SIZE - 長度陣列。

+0

確實。使用new和delete操作符保證構造函數和析構函數被調用,如果使用malloc爲類對象分配內存,則不會發生這種情況。 – Kourosh

+0

感謝您的答案:)但爲什麼它與memcpy()工作? – user2443309

+0

@ user2443309可能只是純粹的運氣。它看起來像*未定義的行爲*。 – juanchopanza