C ++动态内存分配问题

时间:2013-06-01 13:49:18

标签: c++ pointers opencv memory-management

以下代码根据我如何定义newImagesData给出了seg.fault(参见下面的注释)。如果它的数组一切正常,但如果定义为指针 - 错误:(

//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()它可以正常工作。 我能理解我做错了什么。有什么帮助吗?

1 个答案:

答案 0 :(得分: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,因为您将使用FIFO_SIZE长度的cv::Mat个对象数组。