0

次のコードは、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() を使用すると、正常に動作します。私は自分が間違っていることを理解できます。何か助けはありますか?

4

1 に答える 1

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

オブジェクトの-length 配列をnewImageData使用する場合と同じように使用できます。FIFO_SIZEcv::Mat

于 2013-06-01T13:53:07.323 に答える