一、问题的来源
今早在实验室开发相机时,为了将从采集卡获取的图像数据分别送到子类显示和保存。我定义了一个位图数据指针用来存放从相机获取的图像数据,具体代码如下:
EVT_ERROR err = EVT_SUCCESS;
err = EVT_AllocateFrameBuffer(&m_EVTCamera, &evtFrame, EVT_FRAME_BUFFER_MAX);
err = EVT_CameraQueueFrame(&m_EVTCamera, &evtFrame);
err = EVT_CameraGetFrame(&m_EVTCamera, &evtFrame, EVT_INFINITE);
m_lpImageDate = evtFrame.imagePtr;EVT_ReleaseFrameBuffer(&m_EVTCamera, &evtFrame);
在主对话框的析构函数中,我进行了图像数据释放,具体如下:
if(m_lpImageDate != NULL)
{
delete []m_lpImageDate;
m_lpImageDate = NULL;
}
当我每次点击主对话框右上角的关闭按钮退出程序时,电脑直接变蓝屏。我在对话框的OnClose()函数中进行了相机资源的关闭和释放。
经过无数次调试排除后发现,在把相机的图像数据赋值给m_lpImageData时出问题。重新修改后问题得到解决,修改后的赋值语句如下:
memcpy(m_lpImageData, evtFrame.imagePtr, m_nImgWidth * m_nImgHeight);
二、原因分析
m_lpImageDate = evtFrame.imagePtr;
该语句把evtFrame.imagePtr的首地址赋给了m_lpImageDate,这样无形中就把m_lpImageDate和evtFrame.imagePtr指向了同一块内存。当我关闭主对话框时,先调用关闭相机资源相关函数,而在调用关闭相机函数时就已经把m_lpImageDate和evtFrame.imagePtr指向的那块内存释放了,走完相机关闭函数后,开始走析构函数去释放m_lpImage肯定崩了,因为这块内存根本就不存在了,所以delete []m_lpImageDate出错。
而用memcpy只是进行指针指向那块内存的数据进行拷贝,并没有将两个指针的首地址关联在一起,所以系统不崩。
转载请注明原文地址: https://ju.6miu.com/read-16621.html