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

C++重载*运算符时字符缓冲区出现垃圾数据问题求助

问题分析与修复方案

核心问题1:未给缓冲区添加字符串终止符\0

C风格字符串必须以\0结尾,否则std::strlen、std::cout这类函数会持续读取内存直到找到随机的\0,这就是你看到末尾垃圾数据的直接原因。你分配了what+1大小的缓冲区,但仅填充了what个字符,最后一位未设置为\0。

核心问题2:返回局部对象的引用

函数内创建的局部对象temp会在函数执行完毕后被销毁,返回它的引用会指向已释放的内存,属于未定义行为,这会导致后续操作出现垃圾值甚至崩溃。

其他优化点

  • 循环中多次调用std::strlen(str),每次都会遍历整个字符串,效率低下,直接复用之前计算好的size变量即可。
  • 调试用的std::cout可按需保留,发布代码建议移除。

修复后的代码

//Repeat Operator
Mystring Mystring::operator*(int x){
    // 提前计算原字符串长度,避免重复调用strlen
    int size = std::strlen(str);
    int total_size = size * x;

    // 分配缓冲区,+1留位置给终止符
    char* buff = new char[total_size + 1];

    int index = 0;
    for (int i = 0; i < x; i++) {
        for (int y = 0; y < size; y++) {
            buff[index++] = str[y];
        }
    }
    // 必须添加字符串终止符
    buff[total_size] = '\0';

    // 调试输出(可选)
    std::cout << buff << std::endl;

    Mystring temp{ buff };
    delete[] buff;
    // 返回对象副本,而非引用
    return temp;
}

额外说明

  • 如果你的Mystring类实现了移动构造函数,可以直接返回Mystring{buff},避免不必要的拷贝,提升效率。
  • 确保Mystring的构造函数能正确处理传入的C风格字符串(即复制内容而非直接浅拷贝指针),否则可能引发内存管理问题。

内容的提问来源于stack exchange,提问作者Seth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 22:10:01