指针的地址赋值与指针数据的拷贝

    xiaoxiao2021-03-25  96

    一、问题的来源

    今早在实验室开发相机时,为了将从采集卡获取的图像数据分别送到子类显示和保存。我定义了一个位图数据指针用来存放从相机获取的图像数据,具体代码如下: 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

    最新回复(0)