c++ - 避免内存泄漏

标签 c++ oop memory memory-leaks

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

最佳答案

你的 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;
}

关于c++ - 避免内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15536003/

相关文章:

c - 堆栈默认的第一个节点 - c

c++ - OpenGL 球体顶点和 UV 坐标

c++ - ROS、opencv3 和 CMake - 无法删除库

arrays - 如何用自定义对象填充二维数组? swift

C#/面向对象的设计——维护有效的对象状态

PHP:将对象用作数据库产品的有效方法

C++ 不能使用从基类继承的getter函数

c++ - 求值为左值的表达式示例

c# - 不安全代码中的错误,使用指针读取内存

android - Picasso 缓慢加载大图像