首页 > 解决方案 > 运算符(+)连接字符数组中的文本导致内存泄漏

问题描述

我有一个包含operator + ()要添加 2 个对象的类。该类包含一个属性char *变量str,该变量指向一个分配的char数组,new char[]该数组包含一个 C 样式的文本字符串。我希望将operator +()两个char数组连接到第三个char数组中,该数组分配为一个新的缓冲区,该缓冲区的大小可以包含连接的字符串作为运算符的结果。

我正在使用重载的构造函数和初始化列表,并将变量初始化为默认值。我添加到类中的析构函数释放了为char *str变量中的对象文本缓冲区分配的内存。

没有类析构函数,一切都很好,但是一旦我添加了析构函数,程序就会打印出奇怪的字符。我也看到内存泄漏。

这是代码,请注意这里包含类析构函数!

#include <iostream>
#include <cstring>
#include<cstring>

class Mystring {
private:
    char *str;      
public:
    Mystring():
        str{nullptr} {
        str = new char[1];
        *str = '\0';
        }
    Mystring(const char *s):
         str {nullptr} {
        if (s==nullptr) {
            str = new char[1];
            *str = '\0';
        } else {
            str = new char[std::strlen(s)+1];
            std::strcpy(str, s);
        }
    }
    Mystring(const Mystring &source):
        str{nullptr} {
        str = new char[std::strlen(source.str)+ 1];
        std::strcpy(str, source.str);
        std::cout << "Copy constructor used" << std::endl;
    }
    ~Mystring(){
          delete [] str;
    }

    void print() const{
          std::cout << str << " : " << get_length() << std::endl;
    }

    int get_length() const{
        return std::strlen(str); 
    }
    const char *get_str() const{
        return str;
    }
    Mystring&operator+(const Mystring &dstr)const;

};

// Concatenation
Mystring &Mystring::operator+(const Mystring &dstr)const {
    char *buff = new char[std::strlen(str) + std::strlen(dstr.str) + 1];
    std::strcpy(buff, str);
    std::strcat(buff, dstr.str);
    Mystring temp {buff};
    delete [] buff;
    return temp;
}

int main() {

    Mystring m{"Kevin "};
    Mystring m2{"is a stooge."};
    Mystring m3;
    m3=m+m2;
    m3.print();

    return 0;
}

标签: c++

解决方案


Mystring &Mystring::operator+(const Mystring &dstr)const

这表明它将返回对MyString Your temp 的引用,但它是本地的。这会导致比内存泄漏更严重的问题。

一旦您按价值返回;你会发现它最终可能想要使用复制或移动构造函数;这导致(如评论中所述)3规则(或5规则)。


推荐阅读