C++学习

记录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。 果然还是越界访问了,只修改这一个地方就行,修改后问题解决。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值