课程咨询 :15948779800

保险公司承保达内学员学习效果

  • C++培训:strcpy函数导致release版程序崩溃

    发布:长春达内      来源:达内      时间:2015-10-30

    • 最近在写一个读取模型文件的小程序。很随意的使用了strcpy函数进行char字符数组的拷贝,这个数组是需要传递给PostMessage作为WPARAM的参数。代码部分如下:
       
      1 char pStrCurrentFileName[MAX_PATH] = "";
       
      2 std::string strCurrentFileName;
       
      3
       
      4 //若是有效单个prt文件路径,则直接读取
       
      5 if (IsValidModelPath(m_strInputPath))
       
      6 {
       
      7 //此处省略部分代码
       
      8
       
      9 strCurrentFileName = GetFileNameWithExt(m_strInputPath);
       
      10 strcpy(pStrCurrentFileName, strCurrentFileName.c_str());
       
      11 ::PostMessage(m_hDlg, WM_USER_MSG_SHOWFILENAME, WPARAM(&pStrCurrentFileName), LPARAM(m_strInputPath.size()));
       
      12
       
      13 ReadFile(m_strInputPath);
       
      14
       
      15 //此处省略部分代码
       
      16 }
       
      程序在64位Debug下运行正常,编译成64位Release后,双击exe运行,在执行到此部分后程序闪退,有时候会弹出一个提示对话框(忘记截图 了),大概适合ntdll.dll有关。而且几乎读取所有模型都会出现这个问题。百度了ntdll.dll,原来所有的win32api函数都会调用该 dll,立刻联系到增加的这个strcpy函数(由于用了svn,历史版本也不多,回溯起来也方便^_^)。因为之前在使用strcpy时,也想到是不是 要使用memcpy函数,但当时没怎么考虑就用strcpy了。改用memcpy后,第10行代码替换成:
       
      memcpy(pStrCurrentFileName, strCurrentFileName.c_str(), strCurrentFileName.size());
       
      release下运行再没有出现崩溃的情况。直接搜百度“mfc程序release崩溃”,有篇文章正好有提到,现摘抄如下:
       
      2.数据溢出的问题
       
      如:
       
      char buffer[10];
       
      int counter;
       
      lstrcpy(buffer, "abcdefghik");
       
      如果您使用了strcpy(),lstrcpy() 等函数请注意检查。
       
      在 debug版中buffer的NULL覆盖了counter的高位,但是除非counter>16M,什么问题也没有。但是在release版 中,counter可能被放在寄存器中,这样NULL就覆盖了buffer下面的空间,可能就是函数的返回地址,这将导致ACCESS ERROR。
       
      3.DEBUG版和RELEASE版的内存分配方式是不同的 。
       
      如 果你在DEBUG版中申请ele 为 6*sizeof(DWORD)=24bytes,实际上分配给你的是32bytes(debug版以32bytes为单位分配), 而在release版,分配给你的就是24bytes(release版以8bytes为单位),所以在debug版中如果你写ele[6],可能不会有 什么问题,而在release版中,就有ACCESS VIOLATE。

上一篇:什么是c++输出流

下一篇:将“引用”作为函数参数有哪些特点?

最新开班日期  |  更多

c++--零基础周末班

c++--零基础周末班

开班日期:7月31日

c++--零基础全日制班

c++--零基础全日制班

开班日期:7月31日

c++--全日制就业班

c++--全日制就业班

开班日期:7月31日

c++--免费训练营

c++--免费训练营

开班日期:7月24日

  • 地址:长春市卫星广场成基商务A座9楼
  • 课程培训电话:15948779800     全国服务监督电话:400-111-8989
  • 服务邮箱 tousu@tedu.cn
  • 2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56