2

所以我在 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,但我找不到任何方法可以释放它。

4

3 回答 3

7

operator +被定义为返回 aString但你返回的是 achar*这意味着编译器正在使用构造函数隐式转换它。这会复制字符串,但不会释放您因此泄漏的原始字符串。

正如其他人所建议的那样,您可以做很多事情来改进代码,但是要修复实际的泄漏,您可以这样做:

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;
}
于 2013-03-20T22:33:52.773 回答
3

如果你想把它做好,编写一个字符串类并不是一件简单的事情。对于您面临的特定问题,我可以提出一些建议......

实现append()operator+=创建更大的缓冲区复制内容,交换内部缓冲区和新创建的缓冲区并释放旧缓冲区。

那么operator+就变成了一个微不足道的任务:

String operator+(String lhs, String const & rhs) {
   lhs += rhs;                 // lhs.append(rhs);
   return lhs;
}

(Of course, this is assuming that you provide correct definitions of the copy constructor, and assignment operator)

于 2013-03-20T22:33:53.553 回答
1

您忘记实现 operator= 和复制构造函数。如果您不提供自己的,编译器将为您实现它们,以执行成员明智的复制,这会导致您的内存泄漏。

于 2013-03-20T22:31:27.273 回答