You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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),同时注意两个细节:

  1. strlen计算的是字符串中'\0'之前的字符数,分配内存时需额外加1,用来存储字符串终止符'\0';
  2. 处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:10:26