【问题标题】:Trouble with memcpy in release mode发布模式下 memcpy 的问题
【发布时间】:2013-06-19 14:10:38
【问题描述】:

我有一段代码在 Visual Studio 的调试模式下运行良好,但在发布模式下崩溃。经过一番猜测,我找到了导致崩溃的代码。

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);

这在调试模式下完美运行,但在发布时崩溃。谁能指出错误?

【问题讨论】:

  • 我在 Visual Studio 2010 中以调试模式和发布模式检查了这段代码......它运行良好。我假设您怀疑大型程序中的这段代码..我不得不说,这部分不是在制造麻烦
  • 你“释放”了分配的指针
  • @hazzelnuttie 我解决了这个问题,我在这段代码上方的地方做,strlen(temp+3) 而不是 strlen(temp)+3 !!

标签: c visual-studio-2008


【解决方案1】:

显示的代码部分看起来不错。作为 unwind 答案的补充。失败的可能原因可能是

1)未初始化的变量

2) 预处理器符号_DEBUG 和NDEBUG。如果您在 #ifdef _DEBUG / #endif 块中有任何代码。

3)编译器优化

【讨论】:

  • 关闭优化后是否尝试过?
  • 所以最好在发布模式下开始调试。您可以调试发布版本。只需转到“项目 -> 设置”,选择 Win32 发布配置,选项卡“C/C++”,“常规”并将“调试信息”设置为“程序数据库”。然后转到选项卡“链接器”,然后打开“生成调试信息”。如果您现在重新构建项目,您将能够在调试器中运行它。无论您的程序是崩溃还是没有按预期运行,在调试器中运行它都会告诉您原因。
  • 我发现了问题,我在这段代码上方的地方做,strlen(temp+3) 而不是 strlen(temp)+3 !感谢您的帮助
【解决方案2】:

它看起来合法,像往常一样有一些小问题:

  1. Don't cast the return value of malloc() in C
  2. 使用更多constbuffposlen 都应声明为const
  3. 最重要的是,在访问内存之前检查malloc()的返回值。

【讨论】:

  • 试过了,malloc返回内存,所以也不是问题
【解决方案3】:

当你使用 malloc 时尝试

temp  = malloc((len + 1) *sizeof(*temp));

【讨论】:

  • 这毫无意义,sizeof *temp == sizeof (char) == 1 所以按比例缩放没有效果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 2019-12-26
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
相关资源
最近更新 更多