strcpy函数导致release版程序崩溃
最近在写一个读取模型文件的小程序。很随意的使用了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版程序崩溃的更多相关文章
- 不要在 _ASSERT() 宏中执行功能代码 AND RELEASE版调试办法
程序在DEBUG版正常运行,在RELEASE版就崩溃了,想调试找问题,却发现RELEASE版根本走不到断点... 需要在工程配置中将 Configuration Properties- ...
- 递归函数的写法(以strcpy函数为例)
1. 递归函数模板 递归的前提是,找到一个公共子问题(或公共操作),然后将该函数构造为递归函数. retType function( ... ) { 结束条件 { [处理] 返回 } 递归条件 { [ ...
- 如何定位Release 版本中程序崩溃的位置 ---利用map文件 拦截windows崩溃函数
1 案例描述 作为Windows程序员,平时最担心见到的事情可能就是程序发生了崩溃(异常),这时Windows会提示该程序执行了非法操作,即将关闭.请与您的供应商联系.呵呵,这句微软的“名 ...
- 【转】调试Release发布版程序的Crash错误
http://www.cppblog.com/Walker/archive/2012/11/08/146153.html http://blog.sina.com.cn/s/blog_48f93b53 ...
- 调试Release发布版程序的Crash错误
http://www.cppblog.com/Walker/archive/2012/11/08/146153.html http://blog.sina.com.cn/s/blog_48f93b53 ...
- 调试Release发布版程序的Crash错误(转)
http://blog.sina.com.cn/s/blog_48f93b530100fsln.html 在Windows平台下用C++开发应用程序,最不想见到的情况恐怕就是程序崩溃,而要想解决引起问 ...
- 转载:Linux服务器Cache占用过多内存导致系统内存不足最终java应用程序崩溃解决方案
原文链接: https://blog.csdn.net/u014740338/article/details/66975550 问题描述 Linux内存使用量超过阈值,使得Java应用程序无可用内存, ...
- Linux替换动态库导致正在运行的程序崩溃
在替换so文件时,如果在不停程序的情况下,直接用 cp new.so old.so 的方式替换程序使用的动态库文件会导致正在运行中的程序崩溃.解决的办法是采用“rm+cp” 或“mv+cp” 来替代直 ...
- 《对“XXX::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们》的问题的解决方法
<对“XXX::Invoke”类型的已垃圾回收委托进行了回调.这可能会导致应用程序崩溃.损坏和数据丢失.向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们& ...
随机推荐
- iOS 定时器Timer常见问题
最近有朋友问我使用NStimer遇见与ScrollView并存时存在主线程阻塞的问题,自己总结几种解决方法: 问题原因: 一般定时器timer都会被以默认模式default添加到主线程的runloop ...
- 别名的应用(New-Alias)
New-Alias -name appcmd -value $env:windir\system32\inetsrv\appcmd.exe 这样就可以在当前PS环境下直接使用appcmd了
- 关于android的Activity的四种启动模式
最近做项目遇到一个问题,当触摸屏幕的时候通过intent启动activity,发现会启动多次,而后查阅资料,发现,原来是activity的模式设置问题. Activity的启动模式可以通过Androi ...
- [AngularJS] Transclude -- using what existing in DOM to replace the template elements in directive
var app = angular.module("phoneApp", []); app.controller("AppCtrl", function($sc ...
- 爱维帮---LVS
http://www.aiweibang.com/yuedu/125232503.html
- Linux PAM&&PAM后门
Linux PAM&&PAM后门 我是壮丁 · 2014/03/24 11:08 0x00 PAM简介 PAM (Pluggable Authentication Modules )是 ...
- java_Cookies_1_商品浏览历史记录servlet2
public class CookiesServlet2 extends HttpServlet { // 显示商品详细信息 public void doGet(HttpServletRequest ...
- 使用HttpClient发送请求、接收响应
使用HttpClient发送请求.接收响应很简单,只要如下几步即可. 1.创建HttpClient对象. CloseableHttpClient httpclient = HttpClients.c ...
- 0x80029C4A
法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Office.Interop.Exc ...
- 自定义手势_GestureOverlayVIew
xml文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...