memcpy在释放模式下出现故障
我有一段代码在VisualStudio的调试模式下运行良好,但在发布模式下崩溃。经过大量的猜测,我找到了导致崩溃的代码memcpy在释放模式下出现故障,c,visual-studio-2008,C,Visual Studio 2008,我有一段代码在VisualStudio的调试模式下运行良好,但在发布模式下崩溃。经过大量的猜测,我找到了导致崩溃的代码 char *buff ="some random text"; char *temp = NULL; char *pos = NULL; int len = strlen("random text"); pos = strstr(buff,"random"); temp = (char *) malloc(len+1); memset(temp,0,len+1); memcp
char *buff ="some random text";
char *temp = NULL;
char *pos = NULL;
int len = strlen("random text");
pos = strstr(buff,"random");
temp = (char *) malloc(len+1);
memset(temp,0,len+1);
memcpy(temp,pos,len);
这在调试模式下非常有效,但在发布时崩溃。有人能指出错误吗?它看起来是合法的,像往常一样有一些小毛病:
const
:buff
,pos
和len
都应该声明为const
malloc()
的返回值显示的代码部分看起来不错。作为对unwind答案的补充。失败的可能原因可能是 1) 未初始化变量 2) 预处理器符号_DEBUG和NDEBUG。如果在#ifdef#u DEBUG/#endif块中有任何代码
3) 使用malloc try时的编译器优化
temp = malloc((len + 1) *sizeof(*temp));
试过之后,malloc会返回内存,所以这不是问题。你在关闭优化后试过了吗?所以最好在发布模式下开始调试。你可以调试发布版本。只需转到“项目->设置”,选择Win32版本配置,选项卡“C/C++”,“常规”,并将“调试信息”设置为“程序数据库”。然后转到“链接器”选项卡,并打开“生成调试信息”。如果现在重建项目,则可以在调试器中运行它。不管你的程序是否崩溃或者只是没有按照预期的方式运行,在调试器中运行它都会告诉你原因。我发现了问题,我是在代码上方的一个地方做的,strlen(temp+3)而不是strlen(temp)+3!!感谢您的帮助我在VisualStudio2010中以调试模式和发布模式检查了这段代码。。。它工作得很好。我假设您怀疑大型程序中的这段代码。。我不得不说,这部分并不是在制造麻烦,你是否“释放”了指针allocated@hazzelnuttie我修复了这个问题,我在代码上方的一个地方做,strlen(temp+3)而不是strlen(temp)+3!!这是毫无意义的,
sizeof*temp==sizeof(char)==1
,因此按此缩放没有任何效果。