Loading... # 情景 原本C代码中,申请char*内存空间,是使用的``calloc(1, size)``。 在使用c++11对代码进行重构时,使用new来获取可用堆空间,其部分代码及上下文如下: ```cpp ***前面的省略*** fileBuf = new char(fileSize + 1) if (fileBuf == NULL) { m_logger->error("new memory {} bytes failed, {}", fileSize, strerror(errno)); return false; } fp = fopen(cfgFileName, "r"); if (fp == NULL) { m_logger->error("open file {} failed, {}", cfgFileName, strerror(errno)); delete fileBuf; return false; } if (fread(fileBuf, 1, fileSize, fp) != fileSize) { m_logger->error("read file {} failed, {}", cfgFileName, strerror(errno)); delete fileBuf; fclose(fp); return false; } fclose(fp); ***后面内容省略*** ``` # 问题 每次执行编译生成的程序,都会在15行`fread`那崩,而gdb给的stack信息,是在libc基础库里面... 经过反复`make ./xxx `编译、执行,发现,fileBuf 申请下来后,未将内存块清零,难道是这个原因? 在第三行前面增加`memset(fileBuf,0,fileSize);`编译,执行! 崩在了`malloc`!!! 其实此时问题就已经非常清楚了,是`new char()`的原因! # 解决 将`new char()`改为`new char[]`后,问题解决。 # 反思 这次遇到的问题,是非常非常弱智、低级的问题。 一是完全不应该出现; 二是完全不应该在折腾、检查**N小时**才定位到问题。 # 附录 `new char(n)`表示申请一个`char`所需长度的堆空间,并赋初值为`n`,其内存大小为`sizeof(char)`。 `new char[n]`表示申请一个长度为`n`个`char`所需的连续堆空间,实际为数组,其内存大小为`n*sizeof(char)` 最后修改:2021 年 04 月 03 日 01 : 48 AM © 允许规范转载