c++关于越界访问(内存溢出)

来源:互联网 发布:门诊处方软件 编辑:程序博客网 时间:2024/05/18 20:46

越界访问指访问了不是程序申请的内存区域,比如申请了5个字节的char数组,结果读写数据的第六个元素,或者访问了释放后的内存等等。这种错误,大部分情况会抛出AV(access violation)异常,有时不抛出异常, 有时导致软件直接崩溃(类似"Abnormal program termination");而且抛出异常的地方大多不是越界访问的地方(比如下面的例子),让人摸不着头脑;不抛出异常的时候可能是因为访问了释放后的内存,虽然内存释放了,但还没被系统回收,但时间长了系统也会运行不正常;而且有时在project下的debug版本和release版本下表现的也不一样,比如有时在debug版本下直接导致软件退出,提示:Abnormal program termination,在release版本下有可能不报异常,但运行一段时间后软件还是没有按照预期运行,比如运行迷失等。以下是一个我经历的越界访问的例子:

std::string tmpStr;...std::string funCode=...;...char *tmpc=new char[len-48+1];memset(tmpc,0,len);...tmpStr += funCode;//AV异常抛出的地方...

如果你仅仅查看异常抛出的地方,只是调用std::string的operator+=函数,怎么看也看不出有什么问题! 如果你往前看就会发现我们申请了len-48+1个字节的内存空间, 但是在memeset的时候却填充了len个字节的空间, 多填充了47个字节的空间,而这个越界填充可能就非法填充了tmpStr内部的内存空间,破坏了tmpStr内部的结构,从而造成std::string在函数operator+=的时候抛出异常!

1 0
原创粉丝点击