gpt4 book ai didi

C++动态内存分配问题

转载 作者:太空宇宙 更新时间:2023-11-04 15:21:56 25 4
gpt4 key购买 nike

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

最佳答案

您不应该使用 malloc 动态分配 cv::Mat 对象或数组,因为这只会为对象分配空间,但不会调用它们的构造函数(必须被调用以实例化一个类型,例如 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

然后您可以像使用 FIFO_SIZE 长度的 cv::Mat 对象数组一样使用 newImageData

关于C++动态内存分配问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16873404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com