MFC关于CString.GetAt数组越界的问题

hawk_shadow 2018-07-24 10:28:15
在调试运行过程中,偶尔出现数组越界的异常,异常位置:
AFX_INLINE TYPE& CArray<TYPE, ARG_TYPE>::ElementAt(INT_PTR nIndex)
{
ASSERT(nIndex >= 0 && nIndex < m_nSize); //此处中断
if(nIndex >= 0 && nIndex < m_nSize)
return m_pData[nIndex];
AfxThrowInvalidArgException();
}

这个错误很明显啊,数组越界,然后我就TRACE嘛。找到出错的地方:截取错误部分代码
	TRACE("data_str=%s\n",data_str);
//计算数据长度
int len=data_str.GetLength();
len_str.Format("%d ",len);
TRACE("len_str=%s\n",len_str);
//计算校验和
int crc=data_str.GetAt(0);
TRACE("crc=%s\n",crc);
for(int i=1;i<len;i++)
crc=crc+data_str.GetAt(i);
checksum_str.Format(" %04d]]]]",crc);
//总发送包数据
save_str=save_str+len_str+data_str+checksum_str;
TRACE("save_str=%s\n",save_str);

file.Write(save_str,strlen(save_str));
file.Close();


我调试输出跟踪TRACE,是这样的:
data_str=201807240939 WV 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 99.997 11.2

len_str=140
Second Chance Assertion Failed: File d:\VS2008install\VC\atlmfc\include\afxtempl.h, Line 323
SZFBuoyRecv.exe 已触发了一个断点
SZFBuoyRecv.exe 中的 0x6df1e9ee (msvcr90d.dll) 处最可能的异常: 0xC0000005: 读取位置 0x00000032 时发生访问冲突

很明显是
int crc=data_str.GetAt(0);
这一句中断报错了,我很迷茫呀,GetAt(0)不应该越界才对,求各位大神指点迷津!
...全文
386 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hawk_shadow 2018-07-26
  • 打赏
  • 举报
回复
结贴了,找到问题所在了,通过监视栈发现确实是数组越界造成崩溃,然后已经做出对应修改。感谢楼上各位的解惑和帮助。
schlafenhamster 2018-07-24
  • 打赏
  • 举报
回复
读取位置 0x00000032 时
不是 0 位置
hawk_shadow 2018-07-24
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
是否有多线程访问? 可能要加锁?
这个没有多线程访问,单纯的就是接受数据之后进行存储,我跟踪显示也能看到,在接收第一包数据的时候到GetAt(0)那里就死了,后面的没有执行,第二包数据也没有进行接收
hawk_shadow 2018-07-24
  • 打赏
  • 举报
回复
引用 2 楼 schlafenhamster 的回复:
"读取位置 0x00000032 时发生访问冲突" 不是 0 !
请问不是0啥意思?可以说详细点吗?
schlafenhamster 2018-07-24
  • 打赏
  • 举报
回复
"读取位置 0x00000032 时发生访问冲突" 不是 0 !
zgl7903 2018-07-24
  • 打赏
  • 举报
回复
是否有多线程访问? 可能要加锁?
schlafenhamster 2018-07-24
  • 打赏
  • 举报
回复
不要用 CString 用 BYTE【】,char【】
hawk_shadow 2018-07-24
  • 打赏
  • 举报
回复
我这大概平均两天出这么一个中断,现在加了一些监视,等下次出中断的时候对这个进行监测
待续_1006 2018-07-24
  • 打赏
  • 举报
回复
这一次楼上的办法考点谱了
赵4老师 2018-07-24
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧