最近在写一个读取模型文件的小程序。很随意的使用了strcpy函数进行char字符数组的拷贝,这个数组是需要传递给PostMessage作为WPARAM的参数。代码部分如下:

 char pStrCurrentFileName[MAX_PATH] = "";
std::string strCurrentFileName; //若是有效单个prt文件路径,则直接读取
if (IsValidModelPath(m_strInputPath))
{
//此处省略部分代码 strCurrentFileName = GetFileNameWithExt(m_strInputPath);
strcpy(pStrCurrentFileName, strCurrentFileName.c_str());
::PostMessage(m_hDlg, WM_USER_MSG_SHOWFILENAME, WPARAM(&pStrCurrentFileName), LPARAM(m_strInputPath.size())); ReadFile(m_strInputPath); //此处省略部分代码
}

程 序在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。

这篇文章的原文链接是:http://blog.csdn.net/fanwenbo/article/details/6067156

看来写了程序后,还需要经常release下同时测试,很多在debug下没有出现的问题会反映在release版中。

先记录下,后面有时间再研究下这个问题。

strcpy函数导致release版程序崩溃的更多相关文章

  1. 不要在 _ASSERT() 宏中执行功能代码 AND RELEASE版调试办法

            程序在DEBUG版正常运行,在RELEASE版就崩溃了,想调试找问题,却发现RELEASE版根本走不到断点... 需要在工程配置中将 Configuration Properties- ...

  2. 递归函数的写法(以strcpy函数为例)

    1. 递归函数模板 递归的前提是,找到一个公共子问题(或公共操作),然后将该函数构造为递归函数. retType function( ... ) { 结束条件 { [处理] 返回 } 递归条件 { [ ...

  3. 如何定位Release 版本中程序崩溃的位置 ---利用map文件 拦截windows崩溃函数

    1       案例描述 作为Windows程序员,平时最担心见到的事情可能就是程序发生了崩溃(异常),这时Windows会提示该程序执行了非法操作,即将关闭.请与您的供应商联系.呵呵,这句微软的“名 ...

  4. 【转】调试Release发布版程序的Crash错误

    http://www.cppblog.com/Walker/archive/2012/11/08/146153.html http://blog.sina.com.cn/s/blog_48f93b53 ...

  5. 调试Release发布版程序的Crash错误

    http://www.cppblog.com/Walker/archive/2012/11/08/146153.html http://blog.sina.com.cn/s/blog_48f93b53 ...

  6. 调试Release发布版程序的Crash错误(转)

    http://blog.sina.com.cn/s/blog_48f93b530100fsln.html 在Windows平台下用C++开发应用程序,最不想见到的情况恐怕就是程序崩溃,而要想解决引起问 ...

  7. 转载:Linux服务器Cache占用过多内存导致系统内存不足最终java应用程序崩溃解决方案

    原文链接: https://blog.csdn.net/u014740338/article/details/66975550 问题描述 Linux内存使用量超过阈值,使得Java应用程序无可用内存, ...

  8. Linux替换动态库导致正在运行的程序崩溃

    在替换so文件时,如果在不停程序的情况下,直接用 cp new.so old.so 的方式替换程序使用的动态库文件会导致正在运行中的程序崩溃.解决的办法是采用“rm+cp” 或“mv+cp” 来替代直 ...

  9. 《对“XXX::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们》的问题的解决方法

    <对“XXX::Invoke”类型的已垃圾回收委托进行了回调.这可能会导致应用程序崩溃.损坏和数据丢失.向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们& ...

随机推荐

  1. Vim Skills——Windows利用Vundle和Github进行Vim配置和插件的同步

    OS:Windows Vim安装完成之后,目录如下 vim73:vim运行时所需的文件,对应目录为$VIMRUNTIME变量 vimfiles:第三方的文件,对应目录为$VIM/vimfiles _v ...

  2. JavaScript要点(十三) HTML DOM EventListener

    addEventListener() 方法 <body> <p>该实例使用 addEventListener() 方法在按钮中添加点击事件. </p> <bu ...

  3. excel vba 打印设置(转)

    FROM: http://hi.baidu.com/kdlipm/blog/item/0897dd16ffc03e59f3de32ab.html PageSetup 函式就會記錄時, 設定的記錄三個部 ...

  4. 实例源码--Android简单团购应用源码

      下载源码   技术要点: 1.HTTP通信技术 2.XML数据解析 3.控件的简单应用 4.源码带有非常详细的中文 注释 ...... 详细介绍: 1. HTTP通信技术 通 过HTTP通信技术, ...

  5. Java + MongoDB Hello World Example--转载

    原文地址:http://www.mkyong.com/mongodb/java-mongodb-hello-world-example/ A simple Java + MongoDB hello w ...

  6. Advanced Configuration Tricks

    Advanced Configuration Tricks Configuration of zend-mvc applications happens in several steps: Initi ...

  7. 西门子PLC两线制,四线制

    1 一.对于控制系统模块:两线制,四线制信号都只有两根线接入模件,区别在于: 两线制信号的这两根线一正一负,不带提供信号电流,而且提供供电电压:一般流量,压力,液位等等的信号常用两线制信号,但也要根据 ...

  8. Java设计模式之策略模式(一)

    今年寒假没有回家,打算利用这个假期的时间进行学习设计模式,这一个人感觉比较牛的知识,前一段时间一直在忙着搞自己的专业课,还有就是捣鼓了一下Linux系统,没有好好的学习关于Java还有Android方 ...

  9. 自定义手势_GestureOverlayVIew

    xml文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...

  10. 通过pod导入第三方框架

    项目导入第三方框架的时候,如果直接拖到项目中的话还需要去修改某些设置以及导入头文件等,当项目比较大的时候这个方法就比较笨拙了,我们可以通过pod来简化这写流程: 在使用pod之前我们需要安装Cocoa ...