所以我在C ++中学习OOP,我认为编写自己的字符串类(当然是出于学习目的)是一种很好的做法。我想出了一个我不知道如何解决的问题。这里有一些代码的和平:
class String {
char *str;
public:
String(char const *str);
~String();
String operator + (char const *str);
};
String::String(char *str) {
this->str = _strdup(str);
}
String::~String() {
free(this->str);
}
String String::operator+(char const *str) {
char *temp = (char *) malloc(strlen(str) + strlen(this->str) + 1);
strcpy(temp, this->str);
strcat(temp, str);
return temp;
}
这里的问题是,这段代码会导致内存泄漏。从“operator +”返回调用我的构造函数,它通过分配更多的内存来复制temp,我找不到任何方法可以释放它。
答案 0 :(得分:7)
您的operator +
被定义为返回String
,但您返回char*
,这意味着编译器使用构造函数隐式转换它。这会复制字符串,但不会释放您正在泄漏的原件。
正如其他人所建议的那样,你可以做很多事情来改进代码,但要修复实际的泄漏,你可以这样做:
String String::operator+(char const *str) {
char *temp = (char *) malloc(strlen(str) + strlen(this->str) + 1);
strcpy(temp, this->str);
strcat(temp, str);
String strTmp(temp);
free(temp);
return strTmp;
}
答案 1 :(得分:3)
如果要正确执行,编写字符串类不是一项简单的任务。对于您所面临的特殊问题,我可以提出几点建议......
实现创建更大缓冲区的append()
或operator+=
复制内容,交换内部缓冲区和新创建的缓冲区并释放旧缓冲区。
然后operator+
变成了一项微不足道的任务:
String operator+(String lhs, String const & rhs) {
lhs += rhs; // lhs.append(rhs);
return lhs;
}
(当然,假设您提供了复制构造函数和赋值运算符的正确定义)
答案 2 :(得分:1)
您忘记实现operator =和复制构造函数。如果您不提供自己的,编译器将为您执行成员明智的副本,这会导致您的内存泄漏。