记录C++学习过程中遇到一些调试、编译问题及当时的解决方法,方便日后查阅。
1、0xC0000005: 读取位置0x00000038时发生访问冲突
问题描述:
0xC0000005: 读取位置0x00000038时发生访问冲突,如下图,在进行读文件时发生异常。
解决方法:
主要代码(修改前):
for (int i = 1; i <= nBandCount;++i)
{
// GDAL内波段存储顺序为RGB,需要转换为我们一般的BGR顺序,即低地址到高地址为:B,G,R
unsigned char *pTemp = m_pImgData + i - 1;
GDALRasterBand *pBand = poSrcDataset->GetRasterBand(nBandCount + i - 1);
pBand->RasterIO(GF_Read, 0, 0, m_imgWidth, m_imgHeight, pTemp, m_imgWidth, m_imgHeight, GDT_Byte, 3, 0);
}
分析:关于内存访问的异常,先看是否有野指针以及是否有非法访问(比如越界访问等),先在中断的地方加断点,单步调试进一步缩小出错的位置,然后再调试找解决方法。
我这里发现,中断发生在该for循环结束的地方,说明是for循环里发生的错误,于是我在for循环开始大括号那行加了断点,调试时nBandCount=3,发现第一次循环正常结束,第二次循环结束时便中断了。考虑到可能是访问越界的问题,重点看了下循环变量i相关的语句,便找到了问题所在:nBandCount+i-1,当i=2时该表达式值为4,而我的程序里当前只有三个波段,因此出错,正确的应该是nBandCount - i + 1。 果然还是越界访问了,只修改这一个地方就行,修改后问题解决。