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
相关产品推荐
相关产品推荐

