检测到了缓冲区溢出...

=============================================================
标题:检测到了缓冲区溢出...
摘要:
备注:Windows CE + VC2005
日期:2010.8.5
姓名:朱铭雷
=============================================================
       今天将公司新买的一台微型打印机连接到了wince设备上,开始调试程序,使用微打来打印一些参数等等。调试程序的过程中,遇到了如下错误: 

      
       最开始并没有发现这个问题,因为最开始程序是Debug版本的。最后程序调试完毕之后,生成了Release版本的程序,结果运行的时候弹出了上面的提示。程序代码量很小,就是自己根据微打的说明书封装了几个“打印字符,换行,设置n点行距”函数。其中每个函数中都有类似于如下的一段代码:
       char *pszText;
       pszText = new char[dwNum];
       if(!pszText)
       {
              delete []pszText;
       }
       ... ...      
       delete []pszText;
       pszText = NULL;

       仔细的检查了一遍程序,所有动态申请的内存,都已经delete了,串口在对话框销毁时也已经释放了。然后开始跟踪调试程序,结果还是找不到问题所在。最后开始采用注释部分代码的方法,很容易发现了问题。唉,其实问题的原因很简单,如果是高手,都不用调试,就知道问题在哪。没办法,自己功力太浅,只能一点一点进步了。
       由于我想要打印的内容中,包含当前的系统时间,而以前也写过获取时间的代码,所以就直接复制过来了,但是格式化字符串的内容上添加了“当前时间:”,却忘记了修改strTime数组的大小。结果导致了上面的缓冲区溢出,但是这样的错误,在Debug版本的程序中却发现不了。
       TCHAR strTime[20];
       CTime time = CTime::GetCurrentTime();
       swprintf(strTime,_T("当前时间:%04d-%02d-%02d
%02d:%02d:%02d"),time.GetYear(),time.GetMonth(),time.GetDay(),
              time.GetHour(),time.GetMinute(),time.GetSecond());
       CString m_strtime = (CString)strTime;

       看来对于所声明的数组的大小,还是要非常关心的。于是也想起来了Lippman在C++ Primer上所说的:“C++语言提供了两种类似于vector和迭代器类型的低级符合类型——数组和指针。与vector类型相似,数组也可以保存某种类型的一组对象:而他们的区别在于,数组的长度是固定的。数组一经创建,就不允许添加新的元素。指针则可以像迭代器一样遍历和检查数组中的元素。现代C++程序应尽量使用vector和迭代器类型,而避免使用低级的数组和指针。设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针”
       尔曰浅显,彼云艰深,唯其深入,所以浅出。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值