Valgrind检测出strcpy/strcmp的Invalid read of size 1错误求助
问题根源分析
Valgrind报的Invalid read of size 1本质是字符串操作越界访问了未分配的内存,核心错误出在word::setData函数的内存计算逻辑:
int sizenew = sizeof(newData);
这里的newData是char*类型,sizeof(newData)得到的是指针变量本身的字节数(64位系统为8字节,32位系统为4字节),而非传入字符串的实际长度。这导致你分配的内存new char [sizenew + 2]远小于实际需求:
- 当
strcpy复制字符串时,会写到分配内存的边界之外,触发Valgrind的越界写检测; - 后续
strcmp操作时会读取这些越界内存,再次触发越界读错误。
修复方案
把sizeof(newData)替换成strlen(newData),同时注意两个细节:
strlen计算的是字符串中'\0'之前的字符数,分配内存时需额外加1,用来存储字符串终止符'\0';- 处理
newData为空指针的边界情况,避免strlen调用崩溃。
修复后的setData函数示例:
#include <cstring> // 需包含strlen的头文件 void word::setData(char *newData) { if (data) { delete[] data; data = nullptr; } if (!newData) { // 处理空指针输入 data = nullptr; return; } size_t sizenew = strlen(newData); data = new char[sizenew + 1]; // +1 预留'\0'的存储空间 strcpy(data, newData); }
如果使用C++11及以上标准,更推荐直接用std::string管理字符串,完全避免手动内存分配的问题,从根源上杜绝这类越界错误。
内容的提问来源于stack exchange,提问作者Amy0
相关产品推荐
相关产品推荐

